我刚写了一些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()
'd,并存储指向新数据的指针。必须在某个时候发布新数据。这是在调用container_free()
期间最后一次发生的。
我在container_free()
函数中标记了一行。我会发誓我需要那条线以防止内存泄漏。但是,我不能使用该行(“没有分配对象beeing”),如果删除它就没有内存泄漏。我的循环中的字符串是如何释放的?!
有人可以解释错误的位置吗?
答案 0 :(得分:3)
c->data = &data;
存储指针data
的地址(函数的参数),而不是实际的指针。即,您正在存储指向临时的指针。
您可以仅使用container
成员构建void *data
结构。
答案 1 :(得分:1)
用代码解释larsmans回答做出这些改变:
typedef struct {
void *data;
time_t lastModified;
} container;
void *container_getData(container *c) {
return c->data;
}
void container_setData(container *c, void *data) {
free(c->data);
c->data = data;
}
void container_free(container *c) {
free(c->data);
free(c);
}
还有其他变化 - 这只会让你走上正轨。