前两天调代码的时候出了个运行时错,什么after block之类的,依据经验判断基本是new申请的空间发生错误,一般是越界造成的。
这个问题本身没什么,倒让我对new的内部实现产生小小的好奇。好,试验一把!
我这里只有VC的平台,就看看VC的实现吧!
1
2
3
4
5
6
7
8
9
10
11
#define TYPE int
void main()
{
TYPE *xp=new TYPE[10];
xp[0] = 1;
xp[1] = 2;
xp[9] = 10;
xp[12] = 12;
xp[-3] = 11;
delete []xp;
}
测试源码如上,这段代码在VC6.0上是运行无错的。(当然这么写还是很有问题的)DEBUG进new之后,发现new之后,除了返回可用堆空间的首址,在其前端还有28Byte的头部,用于维护数据结构(具体怎么维护就不清楚啦),并在实际可用空间的首尾各有4Byte用于检测越界,这8个字节的内容全部赋为FD。示意图如下所示:
|头部(28Byte)|前缀检测(4Byte)|实际分配空间|尾部检测(4Byte)|
也就是说如果有哪个变态代码要么不按正常序给数组赋值并产生越界(比如上例的代码),要么就是越界但所赋的值恰好为FDFDFDFD,运行时就不会产生错误信息,虽然实际上是有问题的。
这个小试验说明不了什么,最多说明再牛C的东东也不是十全十美地。
闲来无事,娱乐娱乐