C——内存管理

标签 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() 并存储指向新数据的指针。新数据将不得不在某个时候发布。这是调用 container_free() 期间的最后一次。

我在 container_free() 函数中标记了一行。我发誓我需要那条线来防止内存泄漏。但是,我不能使用该行(“未分配已释放的对象”),并且如果删除它也不会发生内存泄漏。我的循环中的字符串是如何被释放的?!

谁能解释一下错误在哪里?

最佳答案

c->data = &data;

存储指针data(函数的参数)的地址,而不是实际的指针。也就是说,您正在存储一个指向临时对象的指针。

您可以只使用 void *data 成员构建 container 结构。

关于C——内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5370014/

相关文章:

c++ - C++ 中带字符串键的查找表的内存管理

linux - 运行一个大小为 "Unlimited Stack"的应用会有什么影响?

c++ - 如何在 C++ 中打印 const char 指针

objective-c - 自定义初始化失败时如何清理内存

c - 为什么输入96时会出现段错误?

c - 修复不兼容的指针类型警告

pointers - 结构指针方法中的指针可以重新分配给另一个实例吗?

c - 减去指针后的输出

c - g_source_set_callback : invalid callback data pointer

c - 无论如何要得到不是 unix C 选项的论点