new之后发生了什么?
2007-10-26 09:07
399 查看
int main ( )
{
char *p = new char[3];
for(int i = 0; i < 7; i++)
p[i] = '1';
delete [] p;
}
编译运行上面这个简单的例子,在VC和GCC下结果完全不同。很明显程序越界操作(写)内存了。在VC下提示出现致命错误,而在linux下gcc编译后,运行没有任何错误。这是什么原因呢?
仔细调试了上面的程序,观察new之后,内存出现了什么变化。
在VC下:p的地址为:00431CC0
new之前:
00431CAC 00 00 00 00 ....
00431CB0 00 00 00 00 ....
00431CB4 00 00 00 00 ....
00431CB8 00 00 00 00 ....
00431CBC 00 00 00 00 ....
00431CC0 00 00 00 00 .... //分配的地址
00431CC4 00 00 00 00
new之后:
00431CAC 00 00 00 00 ....
00431CB0 03 00 00 00 .... //分配长度为3字节
00431CB4 01 00 00 00 ....
00431CB8 2D 00 00 00 -...
00431CBC FD FD FD FD
00431CC0 CD CD CD FD 屯妄 //分配的地址
00431CC4 FD FD FD 00
显然,new之后,在分配的内存前后都写了一些信息,保证在delete的时候,可以释放正确的消息,而越界操作内存后,这些信息被修改了(这里是后面的FD)所以,delete就会出错。
再来看linux下的调试结果:p的地址为:0x8049730
分配前:
0x8049720: 0x00000000 0x00000000 0x00000000 0x00000000
0x8049730: 0x00000000 0x00000000 0x00000000
分配后:
0x8049720: 0x42076f10 0x4212e340 0x00000000 0x00000011
0x8049730: 0x00000000 0x00000000 0x00000000
这里分配前后,只是被分配的内存前面的信息做了修改,而后面没有变化,所以delete的时候不会出错,但是在写程序时,无论那种情况都要防止出现越界读写内存的现象发生。
{
char *p = new char[3];
for(int i = 0; i < 7; i++)
p[i] = '1';
delete [] p;
}
编译运行上面这个简单的例子,在VC和GCC下结果完全不同。很明显程序越界操作(写)内存了。在VC下提示出现致命错误,而在linux下gcc编译后,运行没有任何错误。这是什么原因呢?
仔细调试了上面的程序,观察new之后,内存出现了什么变化。
在VC下:p的地址为:00431CC0
new之前:
00431CAC 00 00 00 00 ....
00431CB0 00 00 00 00 ....
00431CB4 00 00 00 00 ....
00431CB8 00 00 00 00 ....
00431CBC 00 00 00 00 ....
00431CC0 00 00 00 00 .... //分配的地址
00431CC4 00 00 00 00
new之后:
00431CAC 00 00 00 00 ....
00431CB0 03 00 00 00 .... //分配长度为3字节
00431CB4 01 00 00 00 ....
00431CB8 2D 00 00 00 -...
00431CBC FD FD FD FD
00431CC0 CD CD CD FD 屯妄 //分配的地址
00431CC4 FD FD FD 00
显然,new之后,在分配的内存前后都写了一些信息,保证在delete的时候,可以释放正确的消息,而越界操作内存后,这些信息被修改了(这里是后面的FD)所以,delete就会出错。
再来看linux下的调试结果:p的地址为:0x8049730
分配前:
0x8049720: 0x00000000 0x00000000 0x00000000 0x00000000
0x8049730: 0x00000000 0x00000000 0x00000000
分配后:
0x8049720: 0x42076f10 0x4212e340 0x00000000 0x00000011
0x8049730: 0x00000000 0x00000000 0x00000000
这里分配前后,只是被分配的内存前面的信息做了修改,而后面没有变化,所以delete的时候不会出错,但是在写程序时,无论那种情况都要防止出现越界读写内存的现象发生。
相关文章推荐
- 在浏览器中输入Google.com并且按下回车之后发生了什么?
- 当按下电源之后发生了什么?(详解)----上
- 当你在浏览器中输入Google.com并且按下回车之后发生了什么?
- 在浏览器中输入 Google.com 回车之后发生了什么?
- 在浏览器输入一个网址,按回车之后发生了什么?
- 试试看:把电脑时间调到2099年12月31号之后,会发生什么
- 调用new/delete时究竟发生了什么----Effective C++学习笔记
- 在浏览器中输入URL之后会发生什么(what happens when you type in a URL in browser)
- 页面缓存过期之后会发生什么?
- 在浏览器中输入Google.com并且按下回车之后发生了什么?
- 从源代码的角度分析--在BaseAdapter调用notifyDataSetChanged()之后发生了什么
- 在浏览器中输入Google.com并且按下回车之后发生了什么?(转)
- 输入URL之后都发生了什么
- 在浏览器中输入url回车之后会发生什么
- 输入一个网站之后发生了什么?
- new一个对象,到底会发生什么
- 从源代码的角度分析--在BaseAdapter调用notifyDataSetChanged()之后发生了什么
- 插入usb之后发生了什么
- 当你在浏览器中输入Google.com并且按下回车之后发生了什么?
- 当你在浏览器中输入Google.com并且按下回车之后发生了什么?