vc++中debug error: Damage before/after normal block
2015-07-21 16:05
459 查看
在程序运行结束时,VC++ 6.0如果出现这样一个对话框
就是触发了debug error: Damage before/after normal block
如果编译器报这样的错,几乎可以肯定是在程序中,数组访问越界。例如:
int main()
{
int *p=new int[5];
p[-1]=3;
delete [] p;
return 0;
}
当执行至delete 语句时,就会弹出上图那个对话框,报damage before normal block
如果程序修改成这样
int main()
{
int *p=new int[5];
p[5]=3;
delete [] p;
return 0;
}
执行至delete语句时,则会报damage after normal block 的错误。
什么是normal block?在使用new 操作符为指针申请内存空间时,VC编译器为该指针分配的内存空间就是normal block。这段内存空间每个字节的初始值均为 CD h 。并且把该段内存空间之前4个字节和之后4个字节
的初值赋值为FDFDFDFD h。
用VC的Memory工具可以方便地查看到这段新分配的内存空间的内容。如上面的两个程序,VC为指针p申请的内存空间地址从0x00032f48起始。用Memory查看这个地址附近的内容,就是下图显示的内容:
在用delete 释放该段内存空间时,编译器会检查该段内存之前4个字节内容和之后4个字节内容是否有被改动。如果有,则分别报damage before normal block和damage after normal block。
但是,VC编译器的这种检错功能是十分有限的,防止数组访问越界,主要靠程序员自己小心。如上面的
程序中,如果让p[-2]=3,即对内存地址0x00032F44之前的内存进行改动,编译器是检测不出这样的错误的。同理,对p[6]赋值,或者将p[5]=0xFDFDFDFD,编译器都不会报错的。
就是触发了debug error: Damage before/after normal block
如果编译器报这样的错,几乎可以肯定是在程序中,数组访问越界。例如:
int main()
{
int *p=new int[5];
p[-1]=3;
delete [] p;
return 0;
}
当执行至delete 语句时,就会弹出上图那个对话框,报damage before normal block
如果程序修改成这样
int main()
{
int *p=new int[5];
p[5]=3;
delete [] p;
return 0;
}
执行至delete语句时,则会报damage after normal block 的错误。
什么是normal block?在使用new 操作符为指针申请内存空间时,VC编译器为该指针分配的内存空间就是normal block。这段内存空间每个字节的初始值均为 CD h 。并且把该段内存空间之前4个字节和之后4个字节
的初值赋值为FDFDFDFD h。
用VC的Memory工具可以方便地查看到这段新分配的内存空间的内容。如上面的两个程序,VC为指针p申请的内存空间地址从0x00032f48起始。用Memory查看这个地址附近的内容,就是下图显示的内容:
在用delete 释放该段内存空间时,编译器会检查该段内存之前4个字节内容和之后4个字节内容是否有被改动。如果有,则分别报damage before normal block和damage after normal block。
但是,VC编译器的这种检错功能是十分有限的,防止数组访问越界,主要靠程序员自己小心。如上面的
程序中,如果让p[-2]=3,即对内存地址0x00032F44之前的内存进行改动,编译器是检测不出这样的错误的。同理,对p[6]赋值,或者将p[5]=0xFDFDFDFD,编译器都不会报错的。
相关文章推荐
- 浅谈C/C++内存泄漏及其检测工具
- C和C++中的const区别
- C语言之从字符数组中删除特定的字符
- C++空指针与野指针(迷途指针)
- C++多线程编程简单实例
- C语言调用mysql的存储过程
- [C++设计模式] iterator 迭代器模式
- C++将CBitmap类中的图像保存到文件的方法
- mysql c语言操作
- 一个很好的C++ API函数例子的网站
- C语言读写配置文件的方法
- C++ 中dynamic_cast<>的使用方法
- C++程序编译过程简介
- C++ 使用模板类的原因
- matlib complie C++ with opencv
- Visual C++ 在windows 7 上预编译头错误unexpected precompiled header error, simply rerunning the compiler migh
- PAT (Basic Level) Practise (中文)1023. 组个最小数 (20)C语言
- PAT (Basic Level) Practise (中文)1021. 个位数统计 (15) C语言
- PAT (Basic Level) Practise (中文)1017. A除以B (20) C语言
- PAT (Basic Level) Practise (中文)1013. 数素数 (20) C语言