2016-09-23 154 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; 
} 
相关问题