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堆是不是异常。
- Debug中heapchk.c文件HeapValidate问题
- Debug中heapchk.c文件HeapValidate问题 .
- heapchk.c
- myeclipse中weblogic开启debug跳到class文件问题
- eclipse C/C+ CDT中scanf、cin、 printf、cout不能debug输入输出的问题
- C中头文件的一些问题
- VS2012中出现“无法启动程序...debug\abc.exe,系统找不到指定文件”的问题!
- eclipse 中debug启动tomcat不能debug的问题
- C中实用的DEBUG宏
- VS2015中#if DEBUG的使用(C#)
- 有关文件中DEBUG定义的解释!
- 发运模块中如何创建Debug 文件
- Debug十六进制信息到文件中
- 记录Debug信息到文件中
- 关于tomcat中debug模式启动问题
- OpenCV中debug与release的问题
- C#(WPF)程序将Debug中的.exe文件放入注册表中启动,获取错误的当前路径--解决方案
- debug问题
- android应用程序开发-第一个项目
- 关于URL编码
- 自定义Visual Studio 2010 快捷键
- 向虚拟机发短信(android SMS 调试)
- windows 在计算机上将IP与MAC地址绑定
- Debug中heapchk.c文件HeapValidate问题 .
- EJB持久层cannot simultaneously fetch multiple bags异常的解决
- 用户名好像没了
- Android 一个Activity调用另一个Activity中的公有方法
- 积分怎么争取
- javascript 类继承1
- 联系人操作参考
- 平衡二叉树(解惑)
- 简单封装VFW类进行视频应用开发