2015-06-03 125 views
0

動態分配內存的所有權是什麼?動態分配內存的所有權

例如,在一個程序動態分配存儲器這樣的:

int main() 
{ 
    int * p = malloc(10 * sizeof(int)); 

    return 0; 
} 

1)如果此程序退出,然後將所述存儲器由p指出是freed()? 我認爲答案是,它不會被自動釋放。

2)如果這個程序崩潰,那麼p指向的內存是freed()

+0

這是特定環境/操作系統。通常的桌面/服務器操作系統在處理終止後非常善於清理,無論原因如何。 –

+0

那麼......哪個OS /環境? –

+0

可能還想閱讀有關虛擬內存的內容。 –

回答

1

Memory Deallocation And Allocation

此鏈接將幫助您在很大程度上解決您的問題

下面的文字是從上面提到的鏈接: -

幾乎每個現代操作系統都會在程序退出後恢復所有分配的內存空間。我能想到的唯一例外可能就像Palm OS,其中程序的靜態存儲和運行時內存幾乎相同,所以不釋放可能會導致程序佔用更多的存儲空間。 (我只是在這裏推測)。

所以一般來說,除了運行時存儲的存儲空間超過你的需要的運行成本之外,沒有什麼壞處。當然,在你給出的例子中,你想保留一個可能被使用的變量的內存直到它被清除。

但是,一旦你不再需要它,釋放內存就被認爲是一種很好的方式,並釋放你在程序退出時仍然存在的任何東西。這更多的是瞭解你正在使用的內存,並考慮你是否仍然需要它。如果你不跟蹤,你可能會有內存泄漏。另一方面,在退出時關閉文件的類似警告有一個更具體的結果 - 如果您不這樣做,那麼您寫入它們的數據可能不會被刷新,或者它們是臨時文件,完成後它們可能不會被刪除。此外,數據庫句柄應該有他們的事務提交,然後關閉,當你完成他們。同樣,如果您使用的是面向對象的語言,如C++或Objective C,則在完成對象時不釋放對象意味着析構函數將永遠不會被調用,並且該類負責的任何資源可能不會被清理。

0

在linux上,只要進程終止,它的所有內存都將被釋放,以供重用。

如果您的程序長期運行(例如shell或web服務器守護進程),您應該手動釋放每一塊內存,否則隨着時間的推移可能會達到內存的限制,並且您無法長期分配內存。

如果您的程序運行時間很短,您可以在進程終止時自動完成空閒作業。實際上,free()本身也需要時間,所以這可以節省一些機器資源,儘管強烈的不建議。

免費()手工每一塊內存,也提高您的項目長期可讀性維護。

0

簡稱:GNU libc manual page for free()

因此,根據libc的手冊

,有在一個節目的最後釋放塊中沒有點,因爲所有的程序的空間的返還給系統的時候進程終止。

所以,即使你的程序崩潰,內存被釋放,並歸還給系統