C++中,类Class数组长度的有关问题
C++中,类Class数组长度的问题
看如下代码:
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]为随机数。
为什么定义析构函数后,需要存储数组长度?
可能是因为定义析构函数后,意味着用户需要自己控制“堆内存”的释放,因此需要“对数组里的每个对象,逐个调用析构函数”,所以需要存储数组元素个数。
而不定义析构函数时,意味着用户不会自己控制释放“堆内存”,所以就没必要逐个调用析构函数了,所以就没必要存储数组元素个数了。