2015-10-20 106 views
-5

考虑到这 “伪代码” 序列:会造成内存泄漏吗?

variable x 

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

mallocfree序列会导致内存泄漏?需要用realloc来代替吗?

+2

等待,你_not_使用_malloc_的结果呢? – ForceBru

+0

people ...我正在使用伪代码..只是为了说明这个想法 – jdscardoso

+0

我不明白你为什么不循环它,在一夜之间运行,看看发生了什么。 –

回答

10

什么可能或许发生,如果您按随机顺序进行分配和解除分配在长时间运行的过程中的无数次是memory fragmentation。在实践中,它可能只会发生在运行几天的过程中。

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

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

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

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

您也可以使用一些更高级别的语言实现:OcamlSBCL压缩垃圾收集器,因此当您使用这些语言编写代码时,碎片发生的可能性要小得多。而ocaml的已经内置marshalling和SBCL能够使用save-lisp-and-die

在Linux将其状态保存到磁盘,valgrind对于调试malloc有关的错误的有用工具。

PS。如果你考虑编写一个长时间运行的程序,你应该在设计阶段仔细考虑。恕我直言,嵌入口译员(例如GNU guile)往往是值得的。

+0

这非常有帮助。非常感谢。 – jdscardoso

1

不,这不应该导致内存泄漏。 realloc()用于立即重新分配,而不是先使用free()

+0

他根本不使用realloc,并且从不保存malloc的结果。更进一步,他使用存储在'x'中的垃圾数据。它可能会崩溃 –

+3

他使用伪代码。 –

6

做了几个free(malloc(n));不会导致内存泄漏。 但它可能会破坏内存。

0

您错误地使用了malloc。你应该做

char *data=malloc(24 * sizeof(char)); // or anything instead of 24 

你分配你可以自由free,然后再重新分配它的空间之后。它不会造成任何泄漏。

+0

尝试使用编译器警告一次。它将是一个编译错误。 – ameyCU

+0

@ameyCU,为什么在地球上? http://codepad.org/jqu2JL3D – ForceBru

+0

这就是为什么我说启用您的编译器警告。 – ameyCU

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 
+0

是**伪代码** ...来说明整个想法... – jdscardoso

+1

是的,我知道,我只是提醒你 – milevyo