2012-01-11 58 views
0

可能重複:
C++ delete - It deletes my objects but I can still access the data?
Why doesn't delete destroy anything?如何刪除動態數組指針正確

我創建動態數組,和我的附加價值值像這樣的數組。

int *pArr; 
pArr = new int[10]; 

for(int i=0;i<10;i++){ 
    pArr[i] = i+2; 
} 

delete[] pArr; 

// After deletion I can find the value of the array items. 
cout << pArr[5] << endl; 

正如你在上面的代碼和最後一行中看到的,我可以輸出數組中的第五個元素而沒有任何問題。 與那應該是數組已被刪除。

+12

你誤解了'delete'的含義。內存不是GONE,你剛剛告訴C++你不會再使用它了。然後你破壞了你的諾言。 – 2012-01-11 16:27:33

+0

給予+1的理由爲什麼c和C++不適合孩子。 – 2012-01-11 16:29:27

+3

[你的聖經沒有被觸及。](http://stackoverflow.com/a/6445794/596781) – 2012-01-11 16:33:14

回答

1

要說明的是內存可以再次使用,考慮這個擴展你的代碼:

int *pArr; 
pArr = new int[10]; 

for(int i=0;i<10;i++){ 
     pArr[i] = i+2; 
} 

delete[] pArr; 

int *pArr2; 
pArr2 = new int[10]; 

for(int i=0;i<10;i++){ 
     pArr2[i] = (2*i)+2; 
} 

cout << pArr[5] << endl; 

爲我打印出12。即實際上來自pArr2[5]的值。或者至少我應該說這是爲我的機器使用我的特定編譯器&版本等。正如其他人指出它是未定義的行爲。但是希望我的例子能夠向你展示至少一種未定義的行爲。

0

您確實刪除了它。

然後,你調用未定義的行爲,發現內存仍然存在(*),並沒有歸零 - 像valgrind這樣的工具仍然會顯示它是一個錯誤,但它是。


(*)通過「仍然存在」我的意思是「是的進程訪問」 - 它可以包含任何東西,可是偏偏沒有被覆蓋... 尚未

1

一旦你delete[]數組,並仍然嘗試訪問數組的元素,它是未定義的行爲和任何行爲是可能的。

0

是的,這可能工作,但不是保證工作。刪除[]只會使內存無效,但不會將其歸零。您正在引用的內存在此時無效。所以,不要做:)