考虑这个“伪代码”序列:
variable x
malloc(x);
free(x);
malloc(x);
free(x)
//..so on
执行malloc
,free
序列会导致内存泄漏吗?需要使用realloc
吗?
答案 0 :(得分:10)
如果以随机顺序进行分配和释放,在长时间运行的进程中以数千倍的时间进行分配和释放,那么可能会发生什么?memory fragmentation。实际上,它可能只发生在运行几个天的过程中。
如果您在任何其他分配之前malloc
区域和free
相同的区域,则不太可能发生碎片。在某些"随机"中,分配和释放更有可能发生。顺序。
没有太多事情可做(特别是如果你的申请是malloc
- 大小不同的区域);你可以使用一些压缩garbage collection算法(或者受其启发的东西,阅读GC handbook)。您也可以考虑application checkpointing,即设计您的应用程序,使其能够在磁盘上写入和重新加载其所有空间。然后,经过几个小时的工作,您将检查磁盘上的状态,并从该状态重新启动应用程序。
BTW,对于长时间运行的应用程序,您希望检查点是出于其他原因(例如,避免因电源故障而丢失计算天数)。
您可能会考虑在检查点和重新启动之间升级应用程序。这很棘手。阅读dynamic software updating和continuations。
您还可以使用一些更高级别的语言实现:Ocaml和SBCL具有压缩垃圾收集器,因此当您使用这些语言进行编码时,碎片化的可能性要小得多。并且 Ocaml 内置marshalling,并且SBCL能够使用save-lisp-and-die
将其状态保存到磁盘
在Linux上,valgrind是调试malloc
相关错误的有用工具。
PS。如果你考虑编写一个运行很长时间的持久程序,你应该在设计阶段仔细考虑。恕我直言地嵌入口译员(例如GNU guile)通常是值得的。
答案 1 :(得分:6)
执行多个free(malloc(n));
不会导致内存泄漏。
但它可能会破坏记忆。
答案 2 :(得分:1)
不,这不应该导致内存泄漏。 realloc()
用于立即重新分配,而不是先使用free()
。
答案 3 :(得分:0)
您未正确使用malloc
。你应该做
char *data=malloc(24 * sizeof(char)); // or anything instead of 24
在您分配了空间后,您可以自由free
将其分配,然后重新分配。它不会造成任何泄漏。
答案 4 :(得分:0)
不,您尊重每个malloc
都应该拥有free
。但是,你提供的代码是可疑的。
variable x
malloc(x);
free(x);
malloc(x);
free(x)
//..so on
它应该是:
variable x
x=malloc(n);
free(x);
x=malloc(n);
free(x)
//..so on