我在採訪中被問及內存泄漏和堆腐敗之間的區別。有人可以解釋我這一點。另外我們如何檢測相同的?內存泄漏和堆損壞?
2
A
回答
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
相關問題
- 1. 堆損壞,可能的內存泄漏,C++
- 2. 堆內存損壞
- 3. Qt的堆內存損壞
- 4. 內存堆損壞和GFlags/windbg
- 5. 內存管理,堆損壞和C++
- 6. 返回堆棧和內存泄漏
- 7. 堆損壞錯誤 - 分配內存
- 8. 內存泄漏C#異步(堆棧)
- 9. SpenInView的內存泄漏本地堆棧
- 10. 內存損壞
- 11. 內存泄漏
- 12. 內存泄漏:
- 13. 內存泄漏
- 14. 內存泄漏
- 15. 內存泄漏
- 16. 內存泄漏
- 17. 內存泄漏
- 18. 內存泄漏
- 19. 內存泄漏
- 20. 內存泄漏
- 21. 內存泄漏:
- 22. 內存泄漏
- 23. 內存泄漏
- 24. 內存泄漏
- 25. 內存泄漏
- 26. 內存泄漏
- 27. 內存泄漏
- 28. 內存泄漏
- 29. wkHTMLtoPDF內存損壞和AccessViolationException
- 30. C和OpenCV內存泄漏
這是一個非常詳細的討論。應該在[programmers.se](http://programmers.stackexchange.com/)中提出。 – iammilind
通過對這些主題的研究發現了什麼?我發現了兩篇詳細的維基百科文章,每篇文章都有一篇。 –
@GregHewgill,似乎這裏正在進行研究。 – iammilind