2012-10-09 122 views
2

我在採訪中被問及內存泄漏和堆腐敗之間的區別。有人可以解釋我這一點。另外我們如何檢測相同的?內存泄漏和堆損壞?

+0

這是一個非常詳細的討論。應該在[programmers.se](http://programmers.stackexchange.com/)中提出。 – iammilind

+0

通過對這些主題的研究發現了什麼?我發現了兩篇詳細的維基百科文章,每篇文章都有一篇。 –

+0

@GregHewgill,似乎這裏正在進行研究。 – iammilind

回答

6

內存泄漏是指在整個程序執行過程中,動態分配的內存沒有返回到操作系統。例如:

int foo() { 
    char *p = new char[SOME_NUMBER]; 
    // use p 
    return 0; // oops, never called delete [] p 
} 

堆腐敗,就像任何其他種類的內存損壞,即,你寫一個內存位置,你不「擁有」,事情可以走壞的(例如,如果你寫在堆管理器用來記錄分配的簿記信息);

void foo() { 
    char *p = new char[SOME_NUMBER]; 
    for(int i = 0; i <= SOME_NUMBER; ++i) { 
     p[i] = 'x'; // oops, wrote one char past the end of the array 

    delete [] p; 
} 
5

內存泄漏是當您的應用程序不斷分配內存,但不釋放內存並且內存丟失時。例如該代碼將導致內存泄漏:

while(true) 
{ 
    char * something = new char[10]; 
} 

在每次迭代的內存分配,但在那之後(對下一次迭代),這是不可能的訪問或無它,所以它泄漏。

另一方面,堆損壞是一種內存損壞。據維基,

發生存儲器訛誤時在計算機程序當 存儲器位置的內容被無意地修改由於編程 錯誤;這被稱爲違反記憶安全。當在該程序中稍後使用損壞的 存儲器內容時,它會導致程序崩潰,或導致奇怪和奇怪的程序行爲 。

在C++損壞的堆通常會導致UB。一個簡單的例子會是這樣的:

char * something = new char[10]; 
something[25] = 'a';//<-- accessing the memory we don't actually own