会导致内存泄漏吗?

时间:2015-10-20 13:24:05

标签: c

考虑这个“伪代码”序列:

variable x

malloc(x);
free(x);
malloc(x);
free(x)
//..so on

执行mallocfree序列会导致内存泄漏吗?需要使用realloc吗?

5 个答案:

答案 0 :(得分:10)

如果以随机顺序进行分配和释放,在长时间运行的进程中以数千倍的时间进行分配和释放,那么可能会发生什么?memory fragmentation。实际上,它可能只发生在运行几个的过程中。

如果您在任何其他分配之前malloc区域和free 相同的区域,则不太可能发生碎片。在某些"随机"中,分配和释放更有可能发生。顺序。

没有太多事情可做(特别是如果你的申请是malloc - 大小不同的区域);你可以使用一些压缩garbage collection算法(或者受其启发的东西,阅读GC handbook)。您也可以考虑application checkpointing,即设计您的应用程序,使其能够在磁盘上写入和重新加载其所有空间。然后,经过几个小时的工作,您将检查磁盘上的状态,并从该状态重新启动应用程序。

BTW,对于长时间运行的应用程序,您希望检查点是出于其他原因(例如,避免因电源故障而丢失计算天数)。

您可能会考虑在检查点和重新启动之间升级应用程序。这很棘手。阅读dynamic software updatingcontinuations

您还可以使用一些更高级别的语言实现:OcamlSBCL具有压缩垃圾收集器,因此当您使用这些语言进行编码时,碎片化的可能性要小得多。并且 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