2013-05-05 46 views
0

我這個做一個3D動態數組使用此代碼刪除3D動態數組C++

//layer = 2 

//levelSize.x = 100 

//levelSize.y = 100 

level_array = new int**[layer]; 

    for(int i = 0; i < layer; ++i) 
    { 
     level_array[i] = new int*[(int)levelSize.x]; 
     for(int j = 0; j < levelSize.x; ++j) 
      level_array[i][j] = new int[(int)levelSize.y]; 
    } 

但是當我想刪除它,程序崩潰

for(int i = 0; i != levelSize.x; ++i) 
    { 
     for(int j = 0; j != levelSize.y; ++j) 
     { 
      delete[] level_array[i][j]; 
     } 
     delete[] level_array[i]; 

    } 
    delete[] level_array; 

我不知道在哪裏在刪除數組的代碼中是錯誤的。

請幫我檢查代碼,感謝

+0

我已經有一段時間沒有進行C++,但不應該'delete [] level_array'刪除數組? – 2013-05-05 03:16:14

+1

@zachlatta,不是遞歸的。 – chris 2013-05-05 03:16:29

+1

我首先有一個3D數組的問題,但是使用'std :: vector'或者類似的方法(最好用一維數組包裝它的'Matrix3D'類),你不需要刪除任何東西。 – chris 2013-05-05 03:17:34

回答

5

您對於尺寸[layer][levelSize.x][levelSize.y]數組分配內存,但同時刪除你用它喜歡用尺寸[levelSize.x][levelSize.y][somenting]陣列操作。

for(int i = 0; i != layer; ++i) 
//     ^^^^^ not levelSize.x 
{ 
    for(int j = 0; j != levelSize.x; ++j) 
    //     ^^^^^^^^^^^ not levelSize.y 
    { 
     delete[] level_array[i][j]; 
    } 
    delete[] level_array[i]; 

} 
delete[] level_array; 
+0

爲什麼你不需要做:delete level_array [i] [j] [k]其中k從0到levelSize.y的迭代? – cxs1031 2016-05-11 18:07:30

+0

因爲'level_array [i] [j] [k]'是一個值,而不是分配的數組 – soon 2016-05-11 18:35:11

0

將此命令添加到最後,否則指針將位於堆棧的頂部。

level_array = NULL;

+0

@ T Nguyen:是分配一個空指針太高效,這意味着它指向NULL地址而不是前一個地址,因爲只刪除釋放記憶。這有助於試圖解引用NULL引起的錯誤,這使得我們意識到。如果我們將一個已刪除的指針取消引用而不指定NULL,它可能會給我們一個垃圾值而不抱怨,這就是災難 – Raindrop7 2016-09-23 22:10:38

0

它是如此重要的是要刪除一個昏暗的陣列和多暗淡在堆上分配之間的差別:

#include <iostream> 
using std::cout; 
using std::endl; 

int main() 
{ 

    int*** ptrInt = new int**[3]; 

    for(int i(0); i < 3; i++) 
     ptrInt[i] = new int*[3]; 

    for(int i = 0; i < 3; i++) 
    { 
     for(int j(0); j < 3; j++) 
      ptrInt[i][j] = new int[3]; 
    } 


    for(int i = 0; i < 3; i++) 
    { 
     for(int j(0); j < 3; j++) 
      for(int k(0); k < 3; k++) 
       ptrInt[i][j][k] = k; 
    } 

    for(int i = 0; i < 3; i++) 
    { 
     for(int j(0); j < 3; j++) 
      for(int k(0); k < 3; k++) 
       cout << "ptrInt[" << i << "][" << j << "][" << k << "]: " << ptrInt[i][j][k] << endl; 
    } 

    // now freeing memory: 

    for(int i = 0; i < 3; i++) 
    { 
     for(int j(0); j < 3; j++) 
      delete[] ptrInt[i][j]; 
     delete[] ptrInt[i]; 
    } 
    delete[] ptrInt; 


    cout << endl << endl << endl; 
    return 0; 
}