C - 内存管理

时间:2011-03-20 17:07:40

标签: c pointers memory-management

我刚写了一些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”),如果删除它就没有内存泄漏。我的循环中的字符串是如何释放的?!

有人可以解释错误的位置吗?

2 个答案:

答案 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);
}

还有其他变化 - 这只会让你走上正轨。