產生原因分析
內存泄漏:
所以當程序退出時,系統會收回分配的內存,由於內存已被錯誤地釋放掉,於是就會出現“Debug Assertion Failed”的錯誤。
這個assert說明,有一塊內存在被釋放的時候,它的頭部裏面的信息已經被改掉了,和預期的不一樣。內存分配的程序往往在被分配出的內存塊頭部放上一些校驗信息。這個信息內存的用戶是不知道也不應該修改的。這樣,在內存被釋放的時候,內存分配程序就可以驗對這個頭部信息是否被改過了。若被改過,就說明發生了內存corruption.
可能情況分析
- 有人在內存越界寫東西;
- 這塊內存已經被釋放了,又被重複釋放了一次。(在第一次被釋放中,是內存分配程序改掉了頭部信息)。
內存泄漏代碼樣例
#include<iostream>
using namespace std;
int main()
{
int j=3;
int *a=new int;
cout<<a<<": "<<*a<<endl;
cout<<&j<<": "<<j<<endl;
a=&j;
cout<<a<<": "<<*a<<endl;
cout<<&j<<": "<<j<<endl;
//delete a;
system("pause");
return 0;
運行結果:
00739C30: -842150451
0034FCE0: 3
0034FCE0: 3
0034FCE0: 3
上面程序存在一個問題:a是一個指針,存儲在堆內存,沒有釋放,
當我們去掉delete a 的註釋時,會報錯:
那麼問題出現在哪裏呢?
其實,在給指針a複製時,a=&j; 而對於局部變量j來說,是存儲在桟內存中的,所以這個指針a也指向了桟內存中存放的值的地址,那麼存取這個值都是沒有錯的,
最關鍵的,就是釋放,因爲桟內存是程序結束後自動釋放的,而堆內存需要顯式釋放,如果在程序結束後,j變量對應的值已經不存在了,那麼此時的delete就釋放了一個已經被釋放的內存,則會出現錯誤。