2011-09-05 214 views
4

我有以下代碼:運行時錯誤

int **arr = new int*[5]; 

for(int i = 0; i < 5; ++i) 
    arr[i] = new int[]; 

for(int i = 0; i < 5; ++i) 
    delete [] arr[i]; 

delete [] arr; 

現在它編譯和運行成功,但是如果我從第一行中刪除的陣列尺寸「5」的代碼編譯,但最後一行的運行時錯誤崩潰。我有以下問題,我無法在Straustrup的C++書籍,因特網等中找到答案。

  1. 爲什麼代碼在指定情況下崩潰? (我的猜測是delete []無法找到要刪除的數組大小並崩潰。)
  2. 如果不允許分配多維數組而不指定大小爲什麼這些錯誤在編譯時未被編譯器捕獲?
+0

此線程應該是有幫助的。 http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory – Mahesh

+0

這甚至沒有在GCC 4.6.1上編譯。 –

+0

[相關常見問題](http://stackoverflow.com/questions/4810664/) – fredoverflow

回答

3

隨着[5],你會得到5 int* s的數組。

如果您刪除[5],則表示您需要一個指向指向int的指針。所以基本上,你有new int*[1]

然後,您將索引編號從0到4的數字,這是超出範圍。

+0

Seth 你是說int * []等於int * [1]嗎? 如果是這樣,那麼代碼應該在第二次迭代期間在第一個「for」循環內部崩潰,但實際上它在最後一行崩潰。 – Arik