2013-07-07 74 views
0

我正在學習指針atm。我對delete []運算符感到困惑。 下面是一個例子:C++ delete []運算符混淆

int* a = new int[12]; 

for (int i=0; i<12; i++) 
    a[i]=123; 

delete[] a; 

for (int i=0; i<12; i++) 
    cout <<a[i]<<" "; 

如果我沒有得到它,delete[]經營者應destory陣列中的所有對象。 但我的輸出是這樣的:

10621288 10617028 123 123 123 123 123 123 123 123 123 123 

只有前兩個元素被銷燬。 我做錯了什麼?

回答

2

你做錯了什麼是嘗試訪問a的內容後,它已被刪除。這會調用未定義的行爲(UB),這意味着「任何事情都會發生」。 你絕對不能這麼做,它是代碼中一個值得碰撞的錯誤。

你看到的結果只是「任何事物」的一個特殊的專業化。在另一個系統上運行這個程序,或者使用不同的編譯器,或者使用具有不同設置的相同編譯器,可能最終會做其他事情。

+0

@ kr4lj:在這種情況下,沒有什麼可以銷燬的,因爲數組包含整數 - 只有數組本身的內存被釋放。如果數組包含對象,您會看到它們的析構函數被逐個調用。 – Jon

+0

我也是這樣做的,得到了​​前兩個元素歸零。你不能在物理上弄到一個內存位置:如果零是編譯器和釋放以供以後使用,則D只會變爲零。 –

2

由於您試圖訪問已釋放的內存,因此您的代碼會調用未定義的行爲。什麼事情都可能發生。

1

您的代碼表現出未定義的行爲。銷燬內存與銷燬書籍或花瓶並不相同:內存不會消失,其中的一些內容可能保持不變。

但是,訪問這樣的內存使得你的程序不合法:你的程序不再擁有這塊內存,它屬於其他代碼或程序的另一部分。該內存的任何部分都可以隨時被覆蓋。而且,當你訪問這樣的內存時,你的程序可能會崩潰。

2

你剛剛有幸運輸出仍顯示爲數據實際存在。但你的理解是正確的。您必須執行刪除[] a。

在任何其他的日子裏,你會看到一個崩潰。指針失效異常無效。