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

来源:互联网 发布:mc mac版联机 编辑:程序博客网 时间:2024/09/21 08:56

心情大爽,解决掉一个存在很久让我抓狂的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?
  1. TB_Chosen->ReleaseAll();  
  2. delete TB_Chosen;  
  3. m_paTextBox.RemoveAt(nIndex);  
  4.   
  5. TB_Chosen->Update();  //TB_Chosen 已经在前面释放了,但此处又调用,因此出现了错误  
  6. 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();    //注释掉这句}


 

 

原创粉丝点击