提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

今天在VS2010调试项目中出现的问题,通过调用free出现了这个错误。一般VC的HEAP CORRUPTION DETECTED这类错误只有在开发的DEBUG版本上出现,Realse版本可能看不到这个错误,有时甚至软件程序还能正常运行,但是千万不能被表象所蒙蔽,随着时间的流逝,程序会因为一些莫名其妙的问题而崩溃,所以在Debug版本上出现这个问题是有其道理的,这里无非是对内存的操作出现了问题,内存经典的操作就是通过调用malloc申请内存,以及调用free释放内存,微软在调试模式下帮我们修改了这两个函数,特别是malloc多分配了一些空间,这些空间就是用于检测内存泄漏(Memory Leaks)和内存损坏(Memory damage)等一系列问题的。所以一旦出现这些问题,Debug版本下能立刻反应过来,告知HEAP CORRUPTION DETECTED以及详细原因并中止程序执行。不过我们如果点击调试,VC将跟踪到SDK的malloc实现中去,不是我们自己的程序问题点,这是比较头疼的地方。

首先出现内存泄漏,一般是内存泄漏不会出现这么明显的中断,所以判断是否因为分配内存损坏的原因,经典的是“野指针”问题,因为free释放指针指定的空间后不能置空指针,所以该指针就变成了野指针,其所指向的地址不是我们所期望的,如果这个时候调用free将造成内存损坏,Realse模式下可能会导致程序异常中止,Debug模式下就会出现HEAP CORRUPTION DETECTED的错误。

鉴于此我检查了代码,并没有找到类似问题,这时我的注意力集中在下面图片指示的一段文字上:

HEAP CORRUPTION DETECTED内存损坏.jpg

“CRT detected that the application wrote to memory after end of heap buffer”,意思是C运行时(CRT)检测到应用程序写入了堆缓冲的结尾。基本上可以判断是由于调用malloc分配了空间后,对于这段空间操作不当所造成的。仔细检查了代码,发现了memset,好家伙这么重要的内存操作函数怎么忘了,事实证明,问题确实由memset所致,因为利用memset清0的空间大小比实际空间大小在控制判断时多处理了一点,就是因为这点大小导致了堆损坏,这个问题一直到free才被detect出来,看来Bug隐藏还是比较深的,从另外一个方面讲我们要重视Debug模式下的任何警告消息。

好了,时间不早了,先写这么多,可能表述不清,不过还是先睡觉去了:-)