如果我对我的程序有这样的嗤之以鼻:
struct Node *node;
while(...){
node = malloc(100);
//do stuff with node
}
这意味着每次循环while循环时,我都会重新分配节点指针所指向的100个字节吗?
如果这是真的,那么如果我只有一个指针指向最后发生的malloc,我如何释放我用所有循环所做的所有内存?
谢谢!
答案 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)
你做不到。您需要存储所有指针以释放内存。如果你将这些指针保存在某处,那么只有你可以释放内存。