2013-03-13 37 views
1
int main() 
{ 
    char *a = malloc(1024); 
    return 0; 
} 

上面的程序是否有內存泄漏?儘可能提供完整和技術性的答案。這個程序是否有內存泄漏?

+2

取決於你問誰...有些人不認爲這是泄漏。 – jrok 2013-03-13 12:31:07

+0

@Inisheer,我不問內存是否被釋放:)我問是否這是一個內存泄漏或不。 – kaspersky 2013-03-13 12:33:45

+0

@ gg.kaspersky內存不被釋放是泄漏。在這種情況下,看起來你很好奇在應用程序退出後內存泄漏是否持續。 – Inisheer 2013-03-13 12:37:06

回答

3

該程序本身有泄漏。操作系統是否清理了這個問題是另一回事。我想最好問問'這個程序可能會在任何系統上造成問題嗎?'答案是肯定的。

C標準無處說,分配malloc的內存將在程序終止時釋放,無論是正常還是異常。將其與打開文件進行比較,如果程序正常終止,那麼這些文件將被C實現保證關閉。

+0

我認爲這是最明確的答案(並且是正確的)。 – kaspersky 2013-03-13 13:29:25

+0

@ gg.kaspersky:用'valgrind'演示很容易,它模擬(在某種程度上)計算機和操作系統,在程序之後不會清理。它會報告它永遠失去運行你的程序1,024字節。 – teppic 2013-03-13 13:45:54

4

簡單的答案是肯定的。操作系統是做整理爲你

編輯

對於gg.kaspersky的利益。

當程序到最後你應該整理堆。它表示您已經考慮了所有的分配並提供了這些資源的釋放(這可以說是對於打開的文件或其他操作系統資源是真實的)。

這對你來說足夠複雜嗎?

順便說一句 - 當你訪問一個家庭(OS),你離開它在你到達相同的狀態是很好的禮貌。

+0

我正在尋找複雜的答案。 – kaspersky 2013-03-13 12:32:35

+0

@ gg.kaspersky請參閱評論部分的鏈接。 – Inisheer 2013-03-13 12:33:16

+0

+1 - '操作系統是 - - 至少你希望它是。就像你說自己「爲什麼讓事情變得複雜」,當你打電話給「免費」時,你就知道你讓這些記憶變成了現實。 – Mike 2013-03-13 13:06:39

1

我不會考慮內存泄漏。內存仍然可以通過一個變量,當你退出時仍然在範圍內。

釋放您在程序結束時分配的所有內存僅僅是不必要的迂腐,讓您花時間做一些操作系統可以更有效地爲您做的事情。

編輯(技術細節):

隨着在節目的結束操作的方式的存儲器不必要釋放的malloc的一些實現可以效率極其低下。所有通過內聯(通過邊界標籤或類似機制)保持其會計信息的malloc實現將觸及大部分(如果不是全部)已分配的頁面。通常這不是一個問題,除了弄髒被拋棄的緩存行和TLB條目之外,而是將其與一個使用足夠內存來開始使用swap的程序結合使用,並且爲了釋放它而最終交換大量內存。退出時,操作系統可以更高效地執行此操作(只需將交換插槽標記爲空閒)即可。

如果您有一個將內存返回給操作系統的malloc實現,釋放內存將導致操作系統取消映射內存,如果您位於多處理器系統上,則需要昂貴的TLB操作。退出時,失效可以更有效地完成(通過執行完整的TLB刷新或使TLB標記失效)。

+2

這是一個意見問題(在我看來......)。如果將來您的應用程序轉換爲庫(通常會發生這種情況),您現在必須經過並找出所有需要清理的地方。所以你最好先做。 – 2013-03-13 12:39:53

+0

請考慮分配的內存是否包含對OS資源的引用(例如文件描述符到套接字等)。這會告訴我,如果你還沒有分配包含該描述符的內存,它告訴我程序員沒有關閉套接字,即客戶端/服務器仍然掛起。 – 2013-03-13 12:46:13

+0

@OliCharlesworth,我說得對嗎,忽視「良好的編程實踐」的東西,程序(運行在現代Linux操作系統上)不會導致任何問題? – kaspersky 2013-03-13 12:49:24

1

你的問題是不完整的...因此,你可以得到的最佳答案是「它取決於」。

從程序範圍來看,是的,你有內存泄漏。這應該是顯而易見的。從系統範圍來看,答案取決於您運行的是哪個操作系統。

一般來說,如果您在主流設備(Win7/MacOSX/Linux桌面/筆記本電腦,iOS/Android設備等)上進行編程,則非常安全。我想不出任何主流現代操作系統,在你之後無法清理。

但是,如果您正在使用一些較舊的或嵌入式系統,則您在此處將會泄漏內存。我在uCLinux平臺(專門爲沒有MMU [內存管理單元]的硬件設計的操作系統)上看到了內存泄漏。

動態內存通常被認爲是危險的,這就是爲什麼在一些RTOS上使用動態內存是不合法的。如果您知道應用程序在其整個生命週期中的部署範圍,那麼您可以像這樣編寫代碼......但您可能不會這樣做,並且您不應該對操作系統將執行的操作做出假設。總是清理你自己的爛攤子。

+0

我同意我的問題不完整,它錯過了什麼是內存泄漏的定義。 – kaspersky 2013-03-13 12:53:40

+0

@ gg.kaspersky - 是的,但更重要的是,什麼是操作系統?我認爲這是一個安全的假設,即內存泄漏是「一個無法訪問的RAM地址範圍,只能通過系統的電源週期恢復」,並且(根據我的回答),一些操作系統可以在導致問題之前捕獲/釋放內存泄漏, 「T。 – Mike 2013-03-13 13:03:13

+0

一個現代的Linux操作系統。 – kaspersky 2013-03-13 13:11:22