对new 实现机制的分析
// 平台:VC6.0#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>
//#include "vclib.h"
double *Alloc_Double_Array(long length)
{
double *array = NULL;
if( NULL == (array = new double [length]) )
{
fprintf(stdout, "Merory Exhausted\n");
return NULL;
}
//memset(array, 0, length*sizeof(double));
return array;
}
template <typename T>
void Free_Array (T **array)
{
assert( array != NULL);
printf("array=0x%p,*array=0x%p\n",array,*array);
delete *array;
//delete []array;
}
int main()
{
double *p1 = Alloc_Double_Array(0x100);
double *p2 = Alloc_Double_Array(0x100);
printf("p1=0x%p,p2=0x%p\n",p1,p2);
p1[0] = 1.3;
p2[0] = 2.3;
Free_Array(&p1);
p1 = Alloc_Double_Array(0x100);
//p1 = Alloc_Double_Array(0x100);
p1[0] = 1.3; // 为什么不报错?
p2[0] = 2.3;
printf("p1=0x%p,p2=0x%p\n",p1,p2);
Free_Array(&p2);
p2 = Alloc_Double_Array(0x90);
double *p3 = Alloc_Double_Array(0x10);
p3 = Alloc_Double_Array(0x10);
p3 = Alloc_Double_Array(0x10);
p3 = Alloc_Double_Array(0x10);
printf("p1=0x%p,p2=0x%p,p3=0x%p\n",p1,p2,p3);
p3 = Alloc_Double_Array(0x10);
printf("p1=0x%p,p2=0x%p,p3=0x%p\n",p1,p2,p3);
return 0;
}
上述试验中 p3 的值没有出现 p2 + 0x90 = 0x00382868 + 0x90 = 0x003828f8 ,而是跳过了这个值,个人认为这说明new 在申请内存空间时,当没有找到一个空闲的内存空间刚好和期望的一致时,它将用一个比自己大的空间赋给这个指针,并且把多余的部分空间给丢弃调,而没有把这个大空间分割成两个小空间,重新把小空间连入链表供new查找
注意:不同的计算机,由于运行这个程序的时候,空闲的内存分布不一样,所以并不一定刚好能使用上述代码得到相同的现象。但是,只要适当增加 或者减少 p3 = Alloc_Double_Array(0x10);(也就是这个红色的p3 = Alloc_Double_Array(0x10);操作次数要结合实际情况适当调整 ) 操作,则一定也能复现这种现象。