2011-09-14 32 views
2

如何在C++中取消分配这种类型的3D数组?我有一个具有INT ***量为成员的类,我充满这种方式..如何在C++中取消分配int ***

volume = new int**[xSize]; 
    for(int i =0; i<xSize; i++) 
    { 
     volume[i] = new int*[ySize]; 
     for(int j =0; j<ySize; j++) 
     { 
      volume[i][j] = new int[zSize]; 
      for(int k = 0; k<zSize;k++) 
      { 
       volume[i][j][k] = 0; 
      } 
     } 
    } 
+2

一样:

所以,你有可能把他们都这样。 –

+0

@Als:'删除[]'每个新的[]' – Benoit

+0

@Benoit:啊,Ofcourse,每个'new'删除','delete []'每个'new []' –

回答

6

你只是扭转你的行动(比阵列的填充等)

for(int i =0; i<xSize; i++) 
{ 
    for(int j =0; j<ySize; j++) 
    { 
     delete[] volume[i][j]; 
    } 
    delete[] volume[i]; 
} 
delete[] volume; 
1

你需要通过递归结构的各个层次重复相同的方式,上述(除了最里面的级),并delete以相反的顺序每个元素相比,他们的分配:

for(int i =0; i<xSize; i++) 
{ 
    for(int j =0; j<ySize; j++) 
    { 
     delete[] volume[i][j]; 
    } 
    delete[] volume[i]; 
} 
delete[] volume; 
1

反之。

你需要同样的循环结构,但对于每一个new[],你需要一个delete[]代替,现在嵌套东西前一定要外的东西出现

所以:

int **x = new int*[M]; 
for (i = 0; i < M; i++) 
{ 
    x[i] = new int[N]; 
} 

变为:

for (i = 0; i < M; i++) 
{ 
    delete [] x[i]; 
} 
delete [] x; 
0

容易 - 只需做反向 即步骤删除所有已创建 然后volume[i]所有i值 然后卷那些volume[i][j]

这有点像失去你的钥匙 - 你只需要回溯你的步骤!

2

如果可以,首先要避免手动动态内存管理。例如。使用std::vector

typedef std::vector<int> Vec1D; 
typedef std::vector<Vec1D> Vec2D; 
typedef std::vector<Vec2D> Vec3D; 

Vec3D volume(xSize, Vec2D(ySize, Vec1D(zSize, 0))); 

如在评论中指出,Boost.MultiArray是一个方便的替代。

+0

我不想寻找替代品。 – DogDog

0

一般规则是这样的:您需要为每个new[]有一个匹配delete[]。您看到有new int**[],xSize个实例new int*[]ySize个实例new int[]的一个实例。当你分配它,for循环和`delete`每个`new`你做

for(int i =0; i<xSize; i++) 
{ 
    for(int j =0; j<ySize; j++) 
    { 
     delete[] volume[i][j]; 
    } 
    delete volume[i]; 
} 
delete[] volume;