在 new [] 一个对象数组时,需要保存数组的维度,
C++ 的做法是在分配数组空间时多分配了 4 个字节的大小,专门保存数组的大小,
在 delete [] 时就可以取出这个保存的数,就知道了需要调用析构函数多少次
为验证这一结论,我创建两个用指针表示的数组,一个使用new创建,一个用来指向已经存在的数组。再分别用_msize()函数来获取它们的长度
(_msize()函数作用是取出new字符创建数组空间时,在数组元素内存前面分配的那4个字节大小的空间中保存的数字)
#include <iostream>
using namespace std;
int main()
{
int *t=new int[5];
// 第一个数组t使用new字符创建,创建一个大小为5个int的内存空间
cout<<sizeof(t)<<endl;
cout<<_msize(t)<<endl;
int i[]={1,2,3,4,5};
int *it=i;
// 第二个数组it直接指向一个普通创建的数组i的首字符
cout<<_msize(it)<<endl;
return 0;
}
结果为
可见,第三次cout时返回空白值NULL原因为,非new创建的数组的“用于保存数组中内存大小的空间”里的数为NULL。