您的位置:首页 > Web前端

XXX.exe 中的 0x5404723c (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefee8 时发生访问冲突

2013-09-24 18:02 603 查看
心情大爽,解决掉一个存在很久让我抓狂的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 plaincopyprint?

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();    //注释掉这句
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐