New[]和delete []爲哈要匹配

New一個數組的時候他得地址大小是k*n+4的大小 k是幾個 n是大小 4個字節是爲了存儲數組長度這樣在刪除的時候可以知道要析構delete []多少次析構函數釋放多少內存

New和delete[]結合

int main(int argc, char *argv[]) {
inner *p = new inner[2];
delete p;
return 0;

這塊很容易崩潰
因爲我們使用了delete,delete不同於delete[],它認爲這只是一個對象佔用的空間,不是對象數組,不會訪問前4個字節獲取長度,所以只調用了一次析構函數。而且,最後釋放內存的時候只釋放了起始地址爲A的內存。然而這不是這一整塊內存的起始地址,整塊內存的起始地址應該是A-4,釋放內存如果不從內存起始地址操作就會出現斷錯誤,所以導致程序掛掉。

new和delete[]結合

int main(int argc, char *argv[]) {
inner *p = new inner();
delete []p;
return 0;

這裏調用了不定次數的析構函數,並且掛掉,是因爲在new時候沒有多申請4個字節存儲長度,而delete[]時候還會向前找4個字節獲取長度,這4個字節是未定義的,所以調用了不固定次數的析構函數,釋放內存的時候也釋放了起始地址爲A-4的內存,而正常的起始地址應該是A,所以程序掛掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章