自己动手解决HEAP: Free Heap block XXX modified at YYY after it was freed问题

        前段时间接手的项目中有出现HEAP: Free Heap block XXX modified at YYY after it was freed问题,作为C/C++程序员,如果代码写得不规范,出现这样的问题就不足为奇了。出现这样问题的根本原因就是野指针,即:对已经释放了的内存进行写操作。如:

 

int* p = new int;
int* pp = p;
delete p;

*pp = 1; //野指针赋值

       在野指针赋值后,如果下次内存分配时,分配到上pp所指地址段,在DEBUG版本调试时,就会在VS的输出窗口出现Free Heap block XXX modified at YYY after it was freed提示。

 

        出现这样的提示说明代码内存操作有问题,但是不好定位是哪个指针出现了问题。网上很少有真正能解决这样问题的方案,有说使用GFlags,但是它对大项目的支持是相当不足的,因为使用它会额外占用相当多的内存,如果内存不是很宽裕,会导致程序运行非常慢,甚至无法正常工作。btw,我第一次使用它时,由于不熟悉使用方法,直接导致系统所有程序无法开启,系统无响应,无法正常启动系统等等一系列问题,如果不幸你也出现了这样的问题,那请进入安全模式启动系统,使用GFlags把设置改回来即可。

        其实,我们完全可以自己写代码解决这个问题。根据问题,我们知道是因为已经释放了的指针地址(野指针)所在的内容被改变,那么只要我们在释放的内存的时候把地址记录下来,在出现这样问题的时候,从记录中去查找就可以了。

具体步骤如下:

1.重载new操作符,在new操作中记录下内存分配时的相关信息,最重要的是文件名和文件所在行,方便后面出问题时的查找定位。

2.重载delete操作符,在delete操作中记录下已经释放的内存块信息。

3.写一个可以根据地址查找内存块信息的函数。

经过上面的工作,我们就可以在出现问题时直接定位到引起问题的地方了。

实现后,我写了一个简单的测试示例:

 

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int* p = new int;
    int* pp = p;
    delete p;

    *pp = 1;

    p = new int;
    delete p;

    return 0;
}

调试运行时,出现

 

HEAP[test.exe]: HEAP: Free Heap block 5ed6d8 modified at 5ed71c after it was freed
test.exe 已触发了一个断点

只需要把上面的5ed71c在监视窗口中传入我写的FindBlock函数中就可以看到出现问题所在的文件行了,如下图所示:

 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
heap corruption detected: after normal block是一种内存错误,意味着在程序运行时,对于已分配的内存块之后的内存发生了破坏。这个报错通常是由以下几种原因引起的: 1. 内存越界写入:在访问已分配内存块之后的内存时,写入了超出内存边界的数据。这可能导致其他内存块的数据被覆盖或者指向其他非法的内存地址。 2. 释放已释放内存:在释放动态分配的内存块后,继续对该内存进行读写操作。这样做可能导致其他高速缓存区或数据结构出现问题。 3. 重复释放内存:释放一个已被释放的内存块。这种情况可能导致不可预料的结果,例如double free或者对已释放内存的访问。 4. 内存对齐错误:以错误的内存边界或对齐方式分配内存,例如使用不正确的对齐值进行内存分配。这可能会导致内存访问错误。 解决这个问题的方法包括: 1. 检查内存越界问题:检查代码是否存在写入已分配内存块之后内存的错误,并确保所有的内存访问都在边界内。 2. 确保正确的内存释放:在释放内存之后,不再对该内存块进行任何读写操作,并在需要的情况下将指针值设置为null。 3. 防止重复释放:确保每个内存块只被释放一次,并在释放后将指针值设置为null,以防止误用。 4. 确保正确的内存对齐:在分配内存时,使用正确的内存边界和对齐方式,确保内存访问的正确性。 总之,修复heap corruption detected: after normal block错误需要仔细检查代码中的内存操作,并确保操作正确,避免对未分配或已释放的内存进行访问和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值