基本的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 Nodenext指针,或者将每个对象添加到引用它们的相应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()它的每一块内存。

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