关于heap corruption detected 堆损坏,你空间开辟小了 的简单测试

heap corruption detected: after normal block(#121) at 0x01381eb0.

CRT deleted that the application wrote to memory after end of heap buffer

检测到堆损坏:在0x01381eb0的正常块(#121)之后

CRT删除了应用程序在堆缓冲区结束后写入内存的内容

解决方案,把内存开辟的大一点,因为你对不该存在的位置进行了赋值,多发生在边界处理等时候,看看是删除哪一个指针时出现的错误,然后把这个指针相关地址内容的操作都看一遍,同时有时候可能不是这个指针出错,而是别的指针进行了越界操作,恰好影响了这个指针的内容


程序四区  代码区,堆区,栈区,数据区

new malloc 开辟的内存是在堆区,指针p在栈区,栈区当运行结束时,系统进行删除,所以在栈区的使用时,我们很喜欢指针越界,数组越界用于方便访问,结束等操作(然后频出bug)。而堆区运行结束时,系统不进行自动释放,只能人为手动释放,p所开辟的内存空间只能手动释放。


堆损坏

有一个独立于堆内存的变量

当我们越界赋值的时候,这个变量会去检测,当发现规定地址外里面的内容有变化的操作,就会认为堆损坏

vs2013中,多次断点看内存,发现一个现象

int *p=new int【12】;   12*4个字节内容为cd(默认,跟所在位置有关) 然后跟着4个 fd,8个ab,2个 ee fe ,8个00,之后是一串不规律,不确定的数字 共16字节,在之后就是ee fe 正常的默认堆区值

前12*4字节为保存的数据内容,但是后面的 fd ab eefe 00 等没有变过

只要p【12】赋值还是如p【20】赋值,之后在delete时都会出现

heap corruption detected: after normal block(#121) at 0x01381eb0.

CRT deleted that the application wrote to memory after end of heap buffer

 

然后测试连续开辟两个,内存为段页式存储,当p1和p在同一段时

int *p=new int[12]; int *p1=new int[12];  这两个一起,(中间加一个int a=1 并不会影响p和p1的地址关系)p1的结尾同上,但是p的结尾fd ab eefe 00都正常 ,然后跟12字节不正常数值然后是28个规律的值00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 01 00 00 00 7e 00 00 00 fd fd fd fd然后就是p1

即p【28】为p1【0】

此时p【12】=1,然后释放,会发现运行会卡一会,但是没有影响正常后面操作,但是断点调试会提示 触发断点

然后 p【40】=1(p1越界),先释放p再释放p1 就会出现,其中地址为p1的首地址

heap corruption detected: after normal block(#121) at 0x01381eb0.CRT deleted that the application wrote to memory after end of heap buffer

但是先释放p1,后释放p就没有任何错误

然后再测试p【60】=1(不管是哪个,反正肯定不是正常空间)

发现释放先后顺序改变,都不会出现报错

以上为简单测试,就是直接在main里面,不进行任何操作,直接释放那种,骚操作好玩,但是不要用,吓唬新人还是可以的。改变释放顺序并不是解决方案,只是说改变先后顺序有时候可能不再报错,并不代表你前面的代码都是安全的

 

正常块(#121)

可以理解为代码段的标号,比如函数func和main,在不同函数里出错,会显示出错函数的块号,换言之,#121在哪个运行代码段,0x01381eb0 的这个地址出现了错误

 

删除了应用程序在堆缓冲区结束后写入内存的内容,相当于检测到你的堆溢出了,不释放不会出错,但是这块堆区一直被占用,如果占用太多,电脑就会很卡,释放就只能重启电脑,释放的话就会告诉你删除了它不该删除的东西,比如缓冲区

缓冲区 可以简单理解为   键盘--》缓冲区---》内存某部分--》计算---》内存某部分---》缓冲区---》显示,所有内容都在缓冲区,删错了可能就出事了,比如黑屏,突然关机

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值