[MFC]关于DAMAGE: after Normal block的问题
2017-09-19 10:12
330 查看
原文地址:http://blog.sina.com.cn/s/blog_a4864fde01014962.html
前几天师弟调试程序的时候出现了这样一个错误,出错的位置是在delete [] 一个动态分配的数组时出现的。
经过调查发现错误是因为他之前在给数组赋值的时候越界了1个位置。
也就是double * a= new double [5],结果赋值的时候给a[5]=5。使用c++的同学都知道,一个5维的动态数组,调用时应该是0~4,但是这里给a[5]赋值并没有出错,反而是delete时才会出错。
这其实是因为在动态分配内存的时候往往分配的是一个连续的地址,这一点从可以使用*[a+3]来取值就能够知道。
因此,在动态分配的时候,会在数组界限外加一个用来标识数组范围的标志,例如a数组,就会在a[-1]和a[5]有两个标志,如果我们在这两个位置赋值,赋值和调用时并不会出错,而是在delete [] a时出错,错误的名称就是“DAMAGE: before Normal block”和“DAMAGE: after Normal block”。一般是后者居多。
因此,当你遇见这个错误的时候,记得去检查一下自己数组的赋值吧。
关于DAMAGE: after Normal block的问题
前几天师弟调试程序的时候出现了这样一个错误,出错的位置是在delete [] 一个动态分配的数组时出现的。
经过调查发现错误是因为他之前在给数组赋值的时候越界了1个位置。
也就是double * a= new double [5],结果赋值的时候给a[5]=5。使用c++的同学都知道,一个5维的动态数组,调用时应该是0~4,但是这里给a[5]赋值并没有出错,反而是delete时才会出错。
这其实是因为在动态分配内存的时候往往分配的是一个连续的地址,这一点从可以使用*[a+3]来取值就能够知道。
因此,在动态分配的时候,会在数组界限外加一个用来标识数组范围的标志,例如a数组,就会在a[-1]和a[5]有两个标志,如果我们在这两个位置赋值,赋值和调用时并不会出错,而是在delete [] a时出错,错误的名称就是“DAMAGE: before Normal block”和“DAMAGE: after Normal block”。一般是后者居多。
因此,当你遇见这个错误的时候,记得去检查一下自己数组的赋值吧。
相关文章推荐
- 关于DAMAGE: after Normal block的问题 【from http://blog.sina.com.cn/s/blog_a4864fde01014962.html】
- 关于 DAMAGE:after Normal block(#47) at 0x00000000问题的解决
- [转载]关于DAMAGE: after Normal block的问题
- 关于DAMAGE: after Normal block的问题
- 关于DAMAGE: after Normal block的问题
- DAMAGE:after Normal block问题
- DAMAGE:after Normal block问题
- Debug Error! DAMAGE:after Normal Block (#Xxxx) 问题
- DAMAGE:After normal block(#****)
- DAMAGE:After normal block(#****)
- DAMAGE: after Normal block (#) at 0x....错误分析
- Keil 出现Debug Error! DAMAGE:after Normal block
- DAMAGE:after Normal block的解决方法
- DAMAGE:after Normal block
- 再谈"DAMAGE:after Normal block"的解决方法
- 关于“Damage:before normal block..."(内存的使用错误)
- vc++中debug error: Damage before/after normal block
- DAMAGE:after Normal Block(#63) at 0x00382ca8
- 运行时刻错误:DAMAGE: After normal block
- 关于debug error:Damage before normal block