在动态分配的多维数组之后进行清理

时间:2014-01-28 09:57:32

标签: c++ arrays pointers memory-management dynamic-memory-allocation

所以,我已经动态地为2D阵列分配了内存:

int **paMatrix = new int*[r];

for(int i=0; i<r; i++)
    paMatrix[i] = new int[c];

假设我的代码已定义rc。现在我想再次释放记忆。如果paMatrix是单索引的,那么delete[] paMatrix;就足够了。在这种情况下是否足够,或者我必须写

for(int i=0; i<r; i++)
    delete[] paMatrix[i];

delete[] paMatrix;

如果我需要为每个delete语句调用new一次,有没有办法重写我的代码,这样我只需要一个delete语句?

4 个答案:

答案 0 :(得分:3)

一般情况下,您需要将每个newdelete匹配,因此,如果您正在处理整个原始指针数组,那么您确实需要依次删除每个原始指针。

如果newdelete之间的代码不直接,并且几乎不可能确保它是否会抛出异常,那么这可能是一个严重的麻烦。因此,您应始终使用RAII类型(如容器和智能指针)来管理动态资源。在这种情况下,vector<vector<int>>可能是一个合适的选择。

  

我想真正的问题是“deletedelete[]在幕后真的做了什么?”

如果对象类型有一个非平凡的析构函数,它会在释放内存之前调用每个对象上的析构函数。因此,RAII类型将自动释放他们通过析构函数管理的任何资源;但原始指针没有析构函数,因此删除它们不会释放它们指向的任何内存。

答案 1 :(得分:3)

如上所述,在c ++中,很少有一个间接指针通过指针。事实上,在c ++指针中尽可能避免使用。

  

如果我需要为每个新语句调用一次删除,有没有办法重写我的代码,以便我只需要一个删除语句?

一种方法是:

int *paMatrix = new int[r*c];

但是你需要玩索引。

另一个没有删除语句的解决方案(没有指针)是使用std::vector

std::vector< std::vector< int > > paMatrix( r, std::vector< int >( c, 0 ) );

答案 2 :(得分:1)

你需要

for(int i=0; i<r; i++)
    delete[] paMatrix[i];

delete[] paMatrix;

除了智能指针等之外别无他法。

答案 3 :(得分:1)

如此处的其他答案所述,您需要将对new的调用与要删除的调用进行匹配。

但是,如果您愿意更改2d阵列的概念,则可以大大简化它。例如,如果它真的是一个r x c大小的矩阵,你可以将它分配为一个大小为r * c的单个数组:

int* paMatrix = new int[r*c];

然后您就可以一步删除它。

权衡必须使用paArray[x+c*y]而不是更自然的paArray[x][y]来索引数组。