考慮到這 「僞代碼」 序列:會造成內存泄漏嗎?
variable x
malloc(x);
free(x);
malloc(x);
free(x)
//..so on
做malloc
,free
序列會導致內存泄漏?需要用realloc
來代替嗎?
考慮到這 「僞代碼」 序列:會造成內存泄漏嗎?
variable x
malloc(x);
free(x);
malloc(x);
free(x)
//..so on
做malloc
,free
序列會導致內存泄漏?需要用realloc
來代替嗎?
什麼可能或許發生,如果您按隨機順序進行分配和解除分配在長時間運行的過程中的無數次是memory fragmentation。在實踐中,它可能只會發生在運行幾天的過程中。
如果malloc
區域和free
任何其他分配前相同區,碎片不太可能發生。在某些「隨機」順序中,分配和釋放更有可能發生。
對此沒有太多要做(特別是如果您的應用程序是malloc
-區域大小不同);你可以使用一些壓縮garbage collection算法(或者其他的東西,請閱讀GC handbook)。您也可以根據application checkpointing的方式來思考,即設計您的應用程序,以便能夠在磁盤上寫入並重新加載其所有空間。然後經過幾個小時的工作,您將檢查磁盤上的狀態,然後從該狀態重新啓動應用程序。
順便說一句,對於長時間運行的應用程序,您希望檢查點出於其他原因(例如,避免因電源故障而失去計算天數)。
您可能會考慮在檢查點和重新啓動之間升級應用程序。這很棘手。閱讀關於dynamic software updating和約continuations。
您也可以使用一些更高級別的語言實現:Ocaml和SBCL壓縮垃圾收集器,因此當您使用這些語言編寫代碼時,碎片發生的可能性要小得多。而ocaml的已經內置marshalling和SBCL能夠使用save-lisp-and-die
在Linux將其狀態保存到磁盤,valgrind對於調試malloc
有關的錯誤的有用工具。
PS。如果你考慮編寫一個長時間運行的程序,你應該在設計階段仔細考慮。恕我直言,嵌入口譯員(例如GNU guile)往往是值得的。
這非常有幫助。非常感謝。 – jdscardoso
不,這不應該導致內存泄漏。 realloc()
用於立即重新分配,而不是先使用free()
。
他根本不使用realloc,並且從不保存malloc的結果。更進一步,他使用存儲在'x'中的垃圾數據。它可能會崩潰 –
他使用僞代碼。 –
做了幾個free(malloc(n));
不會導致內存泄漏。 但它可能會破壞內存。
沒有,當你尊重每個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
是**僞代碼** ...來說明整個想法... – jdscardoso
是的,我知道,我只是提醒你 – milevyo
等待,你_not_使用_malloc_的結果呢? – ForceBru
people ...我正在使用僞代碼..只是爲了說明這個想法 – jdscardoso
我不明白你爲什麼不循環它,在一夜之間運行,看看發生了什麼。 –