c++內存泄漏問題

產生原因分析

內存泄漏:
所以當程序退出時,系統會收回分配的內存,由於內存已被錯誤地釋放掉,於是就會出現“Debug Assertion Failed”的錯誤。
這個assert說明,有一塊內存在被釋放的時候,它的頭部裏面的信息已經被改掉了,和預期的不一樣。內存分配的程序往往在被分配出的內存塊頭部放上一些校驗信息。這個信息內存的用戶是不知道也不應該修改的。這樣,在內存被釋放的時候,內存分配程序就可以驗對這個頭部信息是否被改過了。若被改過,就說明發生了內存corruption.

可能情況分析

  1. 有人在內存越界寫東西;
  2. 這塊內存已經被釋放了,又被重複釋放了一次。(在第一次被釋放中,是內存分配程序改掉了頭部信息)。

內存泄漏代碼樣例


#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就釋放了一個已經被釋放的內存,則會出現錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章