[英]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.