Debug中heapchk.c文件HeapValidate问题 .

来源:互联网 发布:电子电路模拟仿真软件 编辑:程序博客网 时间:2024/05/16 18:08

我们在使用VC++进行ATL COM或者MFC开发的时候,如果不注意堆越界的问题,就会遇到_CrtCheckMemory()对Debug堆异常。

比如我遇到的问题:

 

使用MFC的CFileFind类,写了个递归方法,遍历文件夹查找文件。这个方法前面用起来完全正常,没有做过修改,后来出现莫名其名的Debug Heap异常,跟踪到了heapchk.c中的代码,应该是Debug模式下堆内存出错了。

 

在方法前面CFileFind filefind;处,就会出现Debug异常对话框。于是将该方法调用附近,所有的变量传递和内存申请和释放重新检查一遍,最终将该文件遍历查找方法采用win32 api重新实现,问题得到了解决。很妖的问题,也在网上搜到过其他人相似的问题,有人建议用heapchk中debug heap的若干检查方法,在代码不同点验证,找到问题代码。以后我再深究这个问题。

 

原因很简单,肯定是有某个地方操作指针指向的一段内存时发生越界了。Debug方式下, windows对new 和allocate, malloc等申请内存的方法都做了封装,会在申请到的内存以后附加一段Debug堆数据内存,用以做越界的判断。之所以在release方式下,不会弹出此异常,是因为release模式下,c++无法对越界做出判断,不会报错,但是可能会对程序产生致命的错误。

 

典型的Debug 堆溢出例子为:

 

  LPTSTR lpcsBuffer = new TCHAR[255];
  memset((void*)lpcsBuffer  , 0,  256);
  _ASSERTE(_CrtCheckMemory());

 

在_ASSERTE(_CrtCheckMemory());处就会抛出HeapValidate异常。其他情况也有。windows会在new, free, delete, 函数返回等地方自己内部调用_ASSERTE(_CrtCheckMemory());,产生让我们莫名奇妙的问题。

 

这不仅要求我们细心之外,还要不时的在程序各处添加_ASSERTE(_CrtCheckMemory());,来随时检查Debug堆是不是异常。

原创粉丝点击