2016-11-29 84 views
1

考慮下面的代碼段創建的數組:刪除由新[]與刪除[]

#include <iostream> 
#include <limits> 
using namespace std; 


struct my{ 
    int a; 
    ~my(){ 
    cout << "d\n"; 
    } 
}; 
int main(){ 
    my* a = new my[100]; 
    // cout << (void*)a << " " << (void*)&(a[0]) << endl; 
    delete a; // I know I should use delete [], 
      // but just to find out what would happen if I do this. 
} 

的程序被打印d然後給出段故障。 delete的實現假定已經分配了大小爲sizeof(type)的區域,並且必須釋放大量內存。 delete []首先讀取已分配的元素數量。我發現大多數實現都在分配的內存的開頭存儲這個數字ndelete []從開始取n,並繼續釋放n * sizeof(type)字節的分配內存。我不明白爲什麼上面的程序給段錯誤。我嘗試打印地址a&(a[0]),它們完全相同,所以delete試圖清除存儲區域的任何可能性都不正確。有人可以告訴發生了什麼事嗎?

注:當我們分配的基本類型的數組一樣int這不會發生,double

+5

它崩潰,因爲它是未定義的行爲。結束。 –

+0

@SamVarshavchik爲什麼是UB?如果我們通過實施這些功能,應該清楚它爲什麼會發生。 – user3286661

+2

'new'必須與'delete'匹配,'new []'***必須與'delete []'匹配。這就是C++語言規範所說的。還有什麼是錯的。 –

回答

2

行爲undefined。 (某些C++運行時庫以這樣的方式實現,即當您編寫delete時,正確的舊數據類型數組是delete d)。

真的沒有別的可說的。

1

什麼用new分配必須由delete釋放,什麼由new[]必須由delete[]釋放。

  • 沒有分配和其他的API混合new釋放像Windows GlobalFree()

正確刪除:

delete[] a; 
  • ,如果你在一個動態數組呼籲delete將導致對new[]是獲得一個指針使用deleteundefined behaviour