基本的Malloc /免费

时间:2011-10-29 22:49:38

标签: c malloc free

如果我对我的程序有这样的嗤之以鼻:

struct Node *node;
while(...){
    node = malloc(100);
    //do stuff with node
}

这意味着每次循环while循环时,我都会重新分配节点指针所指向的100个字节吗?

如果这是真的,那么如果我只有一个指针指向最后发生的malloc,我如何释放我用所有循环所做的所有内存?

谢谢!

5 个答案:

答案 0 :(得分:4)

请准确分配所需的大小:malloc(sizeof *node); - 如果移动到所有成员大小加倍的64位平台,旧的96字节结构可能会占用新环境中的192个字节

如果您没有任何指向您创建的任何struct Node的指针,那么我认为您不应该首先使用malloc(3)分配它们。如果您的应用程序要求数据在当前函数的调用范围之外持久存在,则malloc(3)最佳。我期待您可以像这样重写您的功能:

struct Node node;
while(...){
    //do stuff with node
}

while(...){
    struct Node node;
    //do stuff with node
}

取决于您是否要访问最后一个节点(第一个版本)(第二个版本)。

当然,如果你真的需要这段代码之外的那些结构,那么你需要存储对它们的引用某处。将它们添加到跟踪struct Node个对象的全局列表中,或将每个对象添加到上一个 next的{​​{1}}指针中,或将每个对象添加到引用它们的相应struct Node,最适合您的应用。

答案 1 :(得分:1)

如果在循环之前设置node = NULL,然后在node = malloc(100)之前使用free(node),那么你应该没问题。循环退出后,您还需要执行一个空闲(节点)。但话说回来,这一切都取决于“//做节点的事情”实际上做了什么。正如其他人所指出的那样,malloc(100)并不是一个好主意。我将使用的是malloc(sizeof(* node))。这样,如果节点类型发生变化,则不必更改malloc行。

答案 2 :(得分:1)

如果你不再需要在一次迭代结束时使用malloc的空间,你应该立即释放它。

要跟踪已分配的节点,您可以将它们保存在动态增长的列表中:

#include <stdlib.h>

int main() {
    int i;
    void *node;
    int prt_len = 0;
    void **ptrs = NULL;
    for (i = 0; i < 10; i++) {
        node = malloc(100);
        ptrs = realloc(ptrs, sizeof(void*) * ++prt_len);
        ptrs[prt_len-1] = node;
        /* code */
    }
    for (i = 0; i < prt_len; i++) {
        free(ptrs[i]);
    }
    free(ptrs);
    return 0;
}

注意:如果您需要使用这些方法,您应该重新考虑算法!

否则请参阅sarnold's answer

答案 3 :(得分:0)

  

然后,如果我只有一个指针指向发生的最后一个malloc,我如何释放我用所有循环所做的所有内存?

你做不到。你刚刚创建了一个巨人memory leak

完成使用后,您必须跟踪malloc()free()内存的每一块内存。

答案 4 :(得分:0)

你做不到。您需要存储所有指针以释放内存。如果你将这些指针保存在某处,那么只有你可以释放内存。