2016-09-23 118 views
0

我創建了一個3D數組t動態(tint***類型)。現在我試圖刪除它。什麼是刪除動態數組的正確方法?

我所遇到2點建議: 一個是簡單地做

delete[] t; 

,顯然,它會刪除所有內容。

另一種是像做

for(int i=0;i<3;i++) 
{ 
    for(int j=0;j<t1[i];j++) 
    { 
     delete[] t[i][j];//delete all 1D array 
    } 
    delete[] t[i];//delete all 2D array 
} 
delete[] t;//delete the 3D array 

t1t[i]t2大小的t[i][j]大小)

什麼是最好的方法是什麼?

+13

答案取決於記憶是如何在第一時間進行分配。 – aschepler

+0

偏題:'int ***'不會是3D數組。它將是一個數組數組。這些可能會有非常糟糕的緩存性能。如果你只是把東西敲出來,好吧。如果您需要速度,請考慮一維數組和一個使其看起來像3D數組的包裝。 – user4581301

+2

爲什麼不首先使用'std :: vector'? – Jarod42

回答

5

由於@aschepler在評論中提到,這取決於內存如何分配。我認爲你可能分配這樣的記憶:

int*** t = new int**[dim1]; 
for (int i = 0; i < dim1; i++) { 
    t[i] = new int*[dim2]; 
    for (int j = 0; j < dim2; j++) { 
     t[i][j] = new int[dim3]; 
    } 
} 

如果以這種方式分配的內存,那麼內存看起來是這樣的:

     [ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 
       +---> [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 
       |  [ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 
       | 
t ---> [ 0 ] [ 1 ] 
      | 
      |  [ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 
      +---> [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 
       [ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 

現在,假設你只寫

delete[] t; 

如果你這樣做,那麼內存將是這樣的:

     [ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 
         [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 
         [ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 

t ---> xxx 

       [ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 
       [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 
       [ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ] 

換句話說,你已經收回了一個數組,但是你已經泄漏了大部分內存。哎呀!另一方面,如果您使用for循環版本的刪除代碼,則最終會收回所有內存,因爲您已遍歷所有指針並釋放了分配的每個數組。

一般來說,每個分配都應該有一個匹配的解除分配,所以如果你多次撥打new[],你需要撥打相同的次數delete[]

正如一些評論指出的那樣,管理3D陣列可能比使用int ***更好。 C++的一般趨勢是儘可能使用對象自動管理內存。考慮查看Boost multi_array類型,或者考慮編寫圍繞以行優先順序存儲條目的std::vector的包裝。

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; 
    ptrInt = NULL; // if we call delete again on a null pointer it's ok 


    cout << endl; 
    return 0; 
} 
相關問題