You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否从作为结构体字段的回调函数中释放该结构体?

问题解答

你的判断是对的,这段代码里freeFunction完全可以释放指针t指向的Test结构体,操作合法且可行。

原因说明:

  • free()函数的核心作用就是释放通过malloc/calloc/realloc分配的内存块,只要传入的指针是指向这类有效内存的合法指针,不管在哪个函数里调用free()都能完成正确释放。
  • 你的代码中,main函数通过malloc(sizeof(*t))分配了Test结构体的内存,把指针t传给freeFunction后,函数的参数t是原指针的副本,但两者指向同一块malloc分配的内存,因此free(t)能精准释放这块内存。

需要注意的细节:

  • 内存释放后,main函数里的原指针t会变成野指针,此时不能再访问它的成员(比如t->freePtr)或者解引用,否则会触发未定义行为——这是使用free()后的常规注意事项,不影响本次释放操作的正确性。

附上你的代码:

typedef struct Test_s Test;

typedef void (*FreePtr)(Test*);

struct Test_s{
    FreePtr freePtr;
};
    
void freeFunction(Test* t) {
    free(t);
}
void main(void) {
    Test* t = malloc(sizeof(*t));
    t->freePtr = freeFunction;
    t->freePtr(t);
}

内容的提问来源于stack exchange,提问作者Korsarq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:08:10