gpt4 book ai didi

C 结构 self free

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:59 24 4
gpt4 key购买 nike

我想知道是否可以使用结构中定义的方法释放结构。这是一个简单的演示代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct testmem {
int a;
void (*free)(void *);
} testmem;

void xfree(void *mem) {
testmem *tm = (testmem *)mem;
printf("Before: a = %d\n", tm->a);
free(mem);
printf("After: a = %d\n", tm->a);
}

int main(int argc, char* argv[]) {
testmem *tm = (testmem *)malloc(sizeof(testmem));
tm->free = xfree;
tm->a = 10;
(*tm->free)(tm);
return 0;
}

我使用 gcc toy.c -o toy 编译代码,它产生以下结果

Before: a = 10
After: a = 0

我想知道我是否已经成功释放了我分配的内存。我的困惑是,当调用 tm->free 来释放 tm 时,tm->free 也会被释放, tm->free 在执行时损坏?

最佳答案

My confusion is that when tm->free is called to free tm, then tm->free will be also freed, will tm->free corrupt when it is be executed?

tm->free 不是全部功能。它只是指向它的指针。 xfree 函数的代码完全在任何 testmem 对象占用的内存区域之外。

您还必须注意此处的事件顺序。 tm->free 被评估以获取 xfree 的地址 before 执行函数主体中的任何内容。所以调用时指向函数的指针是有效的。它只需要在那一点之前有效。指针可能会在函数执行期间失效,但这不再重要,因为不再需要它的值。


作为旁注,为了一些额外的类型安全,您不需要搞乱 void* 和指针转换。这具有相同的功能...

typedef struct testmem {
int a;
void (*free)(struct testmem *);
} testmem;

void xfree(testmem *mem) {
printf("Before: a = %d\n", mem->a);
free(mem);
// Can't use mem anymore, it's invalid after free is called
}

...但可以防止您将不相关的指针类型传递给函数。

关于C 结构 self free,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52198887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com