簡體   English   中英

如何在c ++中解除分配int ***

[英]How to deallocate a int*** in c++

如何在c ++中釋放這種類型的3D數組? 我有一個有一個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;
            }
        }
    }

你只需要反轉你的動作(除了填充數組)

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

如果可以,請首先避免手動動態內存管理。 例如,使用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是一種方便的替代方案。

您需要以與上面相同的方式遞歸遍歷結構的所有級別(除了最里面的級別),並且與它們的分配相比以相反的順序delete每個元素:

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

相反。

你需要相同的循環結構,但是對於每個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;

簡單 - 只需反向執行步驟即刪除所有已創建的volume[i][j]然后為所有i值的volume[i]然后是音量。

這有點像丟失你的鑰匙 - 你只需要追溯你的步驟!

一般規則是這樣的:你需要為每個new[]設置一個匹配的delete[] new[] 你見過有一個實例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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM