2013-05-07 131 views
0

我有一個動態分配二維數組的代碼,用它進行一些計算,然後將它放到一個名爲result的變量上並釋放二維數組。我想知道爲什麼這會起作用,並且這樣做是一種很好的編程習慣,而不是以後可以釋放的全局二維數組。堆棧上的C++存儲保存在堆棧上

{ 

     int *matrix = new int[5]; 

     for(row = 0; row<array_size+1;row++) 
     { 
      subSolution[row] = new (nothrow) int[request+1]; 
      if(subSolution[row] == NULL) 
       return -1; 
     } 
     //do some stuff 

     result = subSolution[1][request]; 

     for(row = 0; row<array_size+1; row++) 
      delete [] subSolution[row]; 

     delete [] subSolution; 

     return result; 

} 

感謝

+0

我強烈建議你展示一些你正在做的事情的代碼,因爲你可能會得到積極報酬,因爲你所說的不是最可能的。 – 2013-05-07 05:27:02

回答

2

沒有什麼神奇的)),你犯了一個複製數組的一個元素的。現在你可以修改陣列甚至刪除它...你的副本將是永久的。但是,如果你保存數組的指針一個元素,然後刪除陣列,你就會有麻煩:

int * pElement = & matrix[ i ][ j ]; 
deleteMatrix(); 
int x = *pElement; // bad 
+0

爲什麼我認爲這是一個糟糕的編程習慣,它可能導致潛在的崩潰。假設在上面的結果中不是=,我使用memcpy。所以,我可能會覆蓋函數堆棧的一部分。我不確定在運行時它會在執行memcpy後崩潰。也許事後當你嘗試訪問堆棧上的其他東西時? – user2103008 2013-05-08 20:12:56

+0

Aaaa ... Mmmmmm ...有兩種變體:(1)我的英語很差,所以在你的評論中我什麼都不能理解(2)你的評論沒有意義....你可以重述一個問題嗎? – borisbn 2013-05-09 09:35:29

0

你給我們的信息是:

  • 您有一個動態分配的二維數組,大概稱爲矩陣,在您從函數返回之前,您會說您有空。
  • 你有代碼說int result = matrix[i][j],正如你所說,它存儲在堆棧中。

你沒有返回數組。你返回的數組中的int爲[i][j],所以這是非常好的,有效的代碼。

如果你有

int** result = matrix; 
delete matrix; 
// ... 
int i = result[5][3]; 

這會導致不確定的行爲。由於內存已經被你的函數釋放,所以可能有任何東西在它的位置。如果沒有任何東西踩在內存上,它可能看起來很完美,或者它可能完全損壞。