天天看點

XXX.exe 中的 0x5404723c (msvcr100d.dll) 處有未經處理的異常: 0xC0000005: 讀取位置 0xfeeefee8 時發生通路沖突

心情大爽,解決掉一個存在很久讓我抓狂的BUG!!!

其實是重複調用了析構函數。

錯誤資訊:XXX.exe 中的 0x5404723c (msvcr100d.dll) 處有未經處理的異常: 0xC0000005: 讀取位置 0xfeeefee8 時發生通路沖突

是在我點一個按鈕想銷除原有的資料時候出現在中斷錯誤。

通過調用堆棧,找到最後出錯代碼是這段:

CMultiAgent::~CMultiAgent(void)
{
	int nodenum;
	for(nodenum=0;nodenum<m_nNodeNum;nodenum++)
	{
		node[nodenum].~CNode();
	}
	delete [] node;
	laplacianMtx.~CMatrix();
}
           

其中,laplacianMtx是我自己寫的一個CMatrix類的對象。下面m是CMatrix類用來儲存矩陣的一個二維數組。laplacianMtx本身是CMultiAgent類的一個成員變量。

CMatrix::~CMatrix(void)
{
	for(row=0;row<ROW;row++)
	{
		delete [] m[row];
	}
	delete [] m;
}
           

一步步調試,發現在~CMultiAgent中m[row]的位址變成了紅色的0xfeeefeee,又看錯誤資訊是0xfeeefee8通路沖突,問題肯定是在這裡了。

調用laplacianMtx.~CMatrix()并無問題,成功的把laplacianMtx.m銷除了,但是再繼續就出錯,即跳出CMultiAgent::~CMultiAgent(void)時候出錯。

困擾很多天,查了下位址,指針0xfeeefeee的含意,具體可見http://blog.csdn.net/shuilan0066/article/details/7890691

轉:【 

測試時,遇到程式崩潰

    調試時,發現崩潰處的某指針值為0xfeeefeee,此值的含義為:  此指針指向的位置已經被釋放了, 但釋放後,又錯誤的重新調用了這個無效指針。

    經檢查,錯誤之處為:

[cpp] view plain copy print ?

  1. TB_Chosen->ReleaseAll();  
  2. delete TB_Chosen;  
  3. m_paTextBox.RemoveAt(nIndex);  
  4. TB_Chosen->Update();  //TB_Chosen 已經在前面釋放了,但此處又調用,是以出現了錯誤   
  5. TB_Chosen->UpdateCaret();  
TB_Chosen->ReleaseAll();
				delete TB_Chosen;
				m_paTextBox.RemoveAt(nIndex);

				TB_Chosen->Update();  //TB_Chosen 已經在前面釋放了,但此處又調用,是以出現了錯誤
				TB_Chosen->UpdateCaret();
           

   總結,0xfeeefeee的含義為: 指針指向的空間已經被DELETE釋放掉,但程式在未給該指針重新指派前,又錯誤的調用了這個無效的指針

  】

此時恍然大悟,laplacianMtx本就是CMultiAgent的成員,調用~CMultiAgent()時候會自動調用其成員變量laplacianMtx的析構函數~CMatrix(void),而我在此之前手動調用了析構函數,就造成了自動調用析構函數時候找不到CMultiAgent.m的位址,是以出錯。

修改過後一切妥妥的了

CMultiAgent::~CMultiAgent(void)
{
	int nodenum;
	for(nodenum=0;nodenum<m_nNodeNum;nodenum++)
	{
		node[nodenum].~CNode();
	}
	delete [] node;
//	laplacianMtx.~CMatrix();    //注釋掉這句
}