心情大爽,解決掉一個存在很久讓我抓狂的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 ?
- TB_Chosen->ReleaseAll();
- delete TB_Chosen;
- m_paTextBox.RemoveAt(nIndex);
- TB_Chosen->Update(); //TB_Chosen 已經在前面釋放了,但此處又調用,是以出現了錯誤
- 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(); //注釋掉這句
}