首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于 Debug Error!DAMAGE after Normal block(#XXXX) at 0xXXXXXXXX,该怎么处理

2012-06-14 
关于 Debug Error!DAMAGEafterNormalblock(#XXXX)at0xXXXXXXXX我的程序规模比较大,主要就是进行文本处理,

关于 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。

热点排行