動態分配內存的所有權是什麼?動態分配內存的所有權
例如,在一個程序動態分配存儲器這樣的:
int main()
{
int * p = malloc(10 * sizeof(int));
return 0;
}
1)如果此程序退出,然後將所述存儲器由p
指出是freed()
? 我認爲答案是,它不會被自動釋放。
2)如果這個程序崩潰,那麼p
指向的內存是freed()
?
動態分配內存的所有權是什麼?動態分配內存的所有權
例如,在一個程序動態分配存儲器這樣的:
int main()
{
int * p = malloc(10 * sizeof(int));
return 0;
}
1)如果此程序退出,然後將所述存儲器由p
指出是freed()
? 我認爲答案是,它不會被自動釋放。
2)如果這個程序崩潰,那麼p
指向的內存是freed()
?
Memory Deallocation And Allocation
此鏈接將幫助您在很大程度上解決您的問題
下面的文字是從上面提到的鏈接: -
幾乎每個現代操作系統都會在程序退出後恢復所有分配的內存空間。我能想到的唯一例外可能就像Palm OS,其中程序的靜態存儲和運行時內存幾乎相同,所以不釋放可能會導致程序佔用更多的存儲空間。 (我只是在這裏推測)。
所以一般來說,除了運行時存儲的存儲空間超過你的需要的運行成本之外,沒有什麼壞處。當然,在你給出的例子中,你想保留一個可能被使用的變量的內存直到它被清除。
但是,一旦你不再需要它,釋放內存就被認爲是一種很好的方式,並釋放你在程序退出時仍然存在的任何東西。這更多的是瞭解你正在使用的內存,並考慮你是否仍然需要它。如果你不跟蹤,你可能會有內存泄漏。另一方面,在退出時關閉文件的類似警告有一個更具體的結果 - 如果您不這樣做,那麼您寫入它們的數據可能不會被刷新,或者它們是臨時文件,完成後它們可能不會被刪除。此外,數據庫句柄應該有他們的事務提交,然後關閉,當你完成他們。同樣,如果您使用的是面向對象的語言,如C++或Objective C,則在完成對象時不釋放對象意味着析構函數將永遠不會被調用,並且該類負責的任何資源可能不會被清理。
在linux上,只要進程終止,它的所有內存都將被釋放,以供重用。
如果您的程序長期運行(例如shell或web服務器守護進程),您應該手動釋放每一塊內存,否則隨着時間的推移可能會達到內存的限制,並且您無法長期分配內存。
如果您的程序運行時間很短,您可以在進程終止時自動完成空閒作業。實際上,free()本身也需要時間,所以這可以節省一些機器資源,儘管強烈的不建議。
免費()手工每一塊內存,也提高您的項目長期可讀性維護。
簡稱:GNU libc manual page for free()
因此,根據libc的手冊
,有在一個節目的最後釋放塊中沒有點,因爲所有的程序的空間的返還給系統的時候進程終止。
所以,即使你的程序崩潰,內存被釋放,並歸還給系統
這是特定環境/操作系統。通常的桌面/服務器操作系統在處理終止後非常善於清理,無論原因如何。 –
那麼......哪個OS /環境? –
可能還想閱讀有關虛擬內存的內容。 –