关于 Debug Error!DAMAGE after Normal block(#XXXX) at 0xXXXXXXXX,该怎么处理
关于 Debug Error!DAMAGE after Normal block(#XXXX) at 0xXXXXXXXX
我的程序规模比较大,主要就是进行文本处理,文本聚类。背景介绍完毕!
出现的问题是:当我的程序运行一段时间,处理N篇文档后,会报错!弹出对话框:
Debug Error!
Program: ........\XXX.exe
DAMAGE after Normal block(#XXXX) at 0xXXXXXXXX
中止 重试 忽略
在网上有一些资料介绍说是因为内存越界操作,在delete的时候会出现这个问题。如果是这个问题的话,这个错误应该是可重现的,针对同一篇文档,在任何时候,程序处理到该处delete时,都应该报错;可是当我重新运行时,又没有问题了(可能会在后面继续处理其他文档时报错)。
我个人认为可能是有小部分内存new完,没能够delete释放掉,导致内存逐渐耗尽。但是,这样应该报“内存不足”的错误啊!由于程序规模比较大,跟踪难度很大,请问高手有什么函数可以随时查看内存的使用情况啊?比如,可以看处理一篇文档前堆的大小和处理完该篇文档后堆的大小,看是否一致!
另外,请高手解释下DAMAGE到底是怎么回事?网上有很多解释,都不太一样!
小弟在此拜谢了..........
------解决方案--------------------
感觉像是内存越界操作,还是踏实调一下吧,
------解决方案--------------------
应该是内存越界操作,还是调试一下,在“中止 重试 忽略 ”,选择忽略,然后查看堆栈,进行定位
------解决方案--------------------
内存越界本来也没有保证每次一定会在同一个地方重复出现。
------解决方案--------------------
多加一些 ASSERT(_CrtCheckMemory()); 的代码,看看在哪里出现了内存错误。必须包含 crtdbg.h
------解决方案--------------------
内存访问错误确实比较难调试,最好的做法是利用语言的机制直接杜绝之,所谓的构造函数获取资源,析构函数释放资源,重载操作符,确保内存访问的合法性。如果楼主懒得这么做,或是受条件限制无法这么做,我一般用的就是二分查找法了。
假设程序只有一个错误,先让程序运行一半,多试几次,如果不出错了,说明造成错误的逻辑在后半部分,否则在前半部分。无论那边,继续迭代查找。如果程序有多个错误,只好这样一个一个解决了。如果程序本身的模块性比较合理,问题还是能够比较快的解决的。另外,楼上说的多加断言也是很大帮助,不过我建议用标准的 assert。
我的程序规模比较大,主要就是进行文本处理,文本聚类。背景介绍完毕!
出现的问题是:当我的程序运行一段时间,处理N篇文档后,会报错!弹出对话框:
Debug Error!
Program: ........\XXX.exe
DAMAGE after Normal block(#XXXX) at 0xXXXXXXXX
中止 重试 忽略
在网上有一些资料介绍说是因为内存越界操作,在delete的时候会出现这个问题。如果是这个问题的话,这个错误应该是可重现的,针对同一篇文档,在任何时候,程序处理到该处delete时,都应该报错;可是当我重新运行时,又没有问题了(可能会在后面继续处理其他文档时报错)。
我个人认为可能是有小部分内存new完,没能够delete释放掉,导致内存逐渐耗尽。但是,这样应该报“内存不足”的错误啊!由于程序规模比较大,跟踪难度很大,请问高手有什么函数可以随时查看内存的使用情况啊?比如,可以看处理一篇文档前堆的大小和处理完该篇文档后堆的大小,看是否一致!
另外,请高手解释下DAMAGE到底是怎么回事?网上有很多解释,都不太一样!
小弟在此拜谢了..........
------解决方案--------------------
感觉像是内存越界操作,还是踏实调一下吧,
------解决方案--------------------
应该是内存越界操作,还是调试一下,在“中止 重试 忽略 ”,选择忽略,然后查看堆栈,进行定位
------解决方案--------------------
内存越界本来也没有保证每次一定会在同一个地方重复出现。
------解决方案--------------------
多加一些 ASSERT(_CrtCheckMemory()); 的代码,看看在哪里出现了内存错误。必须包含 crtdbg.h
------解决方案--------------------
内存访问错误确实比较难调试,最好的做法是利用语言的机制直接杜绝之,所谓的构造函数获取资源,析构函数释放资源,重载操作符,确保内存访问的合法性。如果楼主懒得这么做,或是受条件限制无法这么做,我一般用的就是二分查找法了。
假设程序只有一个错误,先让程序运行一半,多试几次,如果不出错了,说明造成错误的逻辑在后半部分,否则在前半部分。无论那边,继续迭代查找。如果程序有多个错误,只好这样一个一个解决了。如果程序本身的模块性比较合理,问题还是能够比较快的解决的。另外,楼上说的多加断言也是很大帮助,不过我建议用标准的 assert。