new之后发生了什么?

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的时候不会出错,但是在写程序时,无论那种情况都要防止出现越界读写内存的现象发生。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值