基本的Malloc /免费
如果我对我的程序有这样的嗤之以鼻:
struct Node *node; while(...){ node = malloc(100); //do stuff with node }
这意味着每次循环while循环时,我都会重新分配节点指针所指向的100个字节吗?
如果这是真的,那么如果我只有指针指向发生的最后一个malloc,如何释放我用所有循环所做的所有内存?
谢谢!
请准确分配您需要的大小: 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
对象的全局列表中,或者将每个对象添加到前一个 struct Node
的next
指针,或者将每个对象添加到引用它们的相应struct User
,无论哪种方式最适合您的应用程序。
如果在循环之前设置node = NULL,然后在node = malloc(100)之前使用free(node),那么你应该没问题。 循环退出后,您还需要执行一个空闲(节点)。 但话说回来,这一切都取决于“//做节点的东西”实际上做了什么。 正如其他人所指出的那样,malloc(100)并不是一个好主意。 我将使用的是malloc(sizeof(* node))。 这样,如果节点类型发生变化,则不必更改malloc行。
如果你不再需要在一次迭代结束时使用malloc’ed空间,你应该立即释放它。
要跟踪分配的节点,您可以将它们保存在动态增长的列表中:
#include 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的回答 。
那么如果我只有一个指针指向最后发生的malloc,我如何释放我用所有循环所做的所有内存?
你不能。 你刚刚创造了巨大的内存泄漏 。
当你完成使用它时,你必须跟踪malloc()
和free()
它的每一块内存。
你不能。 您需要存储所有指针以释放内存。 如果你在某处保存那些指针,那么只有你可以释放内存。