看如下代码:
class OperatorNewCls{
private:
//
enum {sz=10};
int arr[sz];
public:
/*定义析构函数后,sizeof(OperatorNewCls)的值未改变,
**但是new OperatorNewCls[size]的值等于(sizeof(OperatorNewCls)*size+4),
**因为在new OperatorNewCls[size][-1]未知存放了数组的长度size。
**
**若不定义析构函数,
**则new OperatorNewCls[size]的值等于sizeof(OperatorNewCls)*size
*/
~OperatorNewCls(){}
//该函数必须是public的,且必须是static,尽管可以不显示指定static
void * operator new[](size_t size){
cout<<"operator[],size="<<size<<endl;
return malloc(size);
}
};
void test43(){
int size=25;
cout<<"sizeof(OperatorNewCls)="<<sizeof(OperatorNewCls)<<endl;
int *arr=(int*)new OperatorNewCls[size];
for(int i=-1;i<size;++i){
cout<<"arr["<<i<<"]="<<arr[i]<<"\t"<<endl;
}
}
执行结果如下:
注释掉OperatorNewCls的析构函数~OperatorNewCls()后,执行结果如下:
差别在于OperatorNewCls数组arr的长度:定义析构函数后,长度为1004bytes,arr[-1]为数组元素个数25;注释析构函数后,长度为1000bytes,arr[-1]为随机数。
为什么定义析构函数后,需要存储数组长度?
可能是因为定义析构函数后,意味着用户需要自己控制“堆内存”的释放,因此需要“对数组里的每个对象,逐个调用析构函数”,所以需要存储数组元素个数。
而不定义析构函数时,意味着用户不会自己控制释放“堆内存”,所以就没必要逐个调用析构函数了,所以就没必要存储数组元素个数了。