看如下代碼:
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,儘管可以不顯示指定staticvoid * 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]為隨機數。
為什麼定義解構函式後,需要儲存數組長度?
可能是因為定義解構函式後,意味著使用者需要自己控制“堆記憶體”的釋放,因此需要“對數組裡的每個對象,逐個調用解構函式”,所以需要儲存數組元素個數。
而不定義解構函式時,意味著使用者不會自己控制釋放“堆記憶體”,所以就沒必要逐個調用解構函式了,所以就沒必要儲存數組元素個數了。