我刚刚写了一些 C 代码:
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef struct {
void **data;
time_t lastModified;
} container;
container *container_init() {
container *c = malloc(sizeof(container));
void *data = NULL;
c->data = &data;
c->lastModified = time(NULL);
return c;
}
void *container_getData(container *c) {
void **containerData = c->data;
return *containerData;
}
// only pass manually allocated data that can be free()'d!
void container_setData(container *c, void *data) {
free(container_getData(c));
c->data = &data;
}
void container_free(container *c) {
free(container_getData(c)); // <--- THIS LINE
free(c);
}
int main(int argc, const char *argv[]) {
for (int i = 0; i < 100000000; i++) {
char *data = strdup("Hi, I don't understand pointers!");
container *c = container_init();
container_setData(c, data);
container_free(c);
}
}
我的逻辑如下:当我调用 container_setData()
时,旧数据被 free()
并存储指向新数据的指针。新数据将不得不在某个时候发布。这是调用 container_free()
期间的最后一次。
我在 container_free()
函数中标记了一行。我发誓我需要那条线来防止内存泄漏。但是,我不能使用该行(“未分配已释放的对象”),并且如果删除它也不会发生内存泄漏。我的循环中的字符串是如何被释放的?!
谁能解释一下错误在哪里?
最佳答案
c->data = &data;
存储指针data
(函数的参数)的地址,而不是实际的指针。也就是说,您正在存储一个指向临时对象的指针。
您可以只使用 void *data
成员构建 container
结构。
关于C——内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5370014/