2011-09-14 6 views
2

このタイプの3D配列をC++でどのように割り当て解除するのですか?私はメンバーとしてのint ***ボリュームを持つクラスを持っていると私はそれをこのように満たされた。..int ***をC++で割り振り解除する方法

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

同じようにあなたがループのために、それを割り当てられ、 'DELETE'はそれぞれ' new'あなたが作ったとして。 –

+0

@Als: 'delete []' each 'new []' – Benoit

+0

@Benoit:ああ、Ofcourse、各 'new'ごとに' delete'、 'new []'ごとに 'delete []' –

答えて

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

簡単 - ちょうど逆 すなわちのステップは、あなたがすべてのi値 ためのその後 volume[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(int i =0; i<xSize; i++) 
{ 
    for(int j =0; j<ySize; j++) 
    { 
     delete[] volume[i][j]; 
    } 
    delete volume[i]; 
} 
delete[] volume; 
関連する問題