2015-10-20 104 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