所以,我已经动态地为2D阵列分配了内存:
int **paMatrix = new int*[r];
for(int i=0; i<r; i++)
paMatrix[i] = new int[c];
假设我的代码已定义r
和c
。现在我想再次释放记忆。如果paMatrix
是单索引的,那么delete[] paMatrix;
就足够了。在这种情况下是否足够,或者我必须写
for(int i=0; i<r; i++)
delete[] paMatrix[i];
delete[] paMatrix;
如果我需要为每个delete
语句调用new
一次,有没有办法重写我的代码,这样我只需要一个delete
语句?
答案 0 :(得分:3)
一般情况下,您需要将每个new
与delete
匹配,因此,如果您正在处理整个原始指针数组,那么您确实需要依次删除每个原始指针。
如果new
和delete
之间的代码不直接,并且几乎不可能确保它是否会抛出异常,那么这可能是一个严重的麻烦。因此,您应始终使用RAII类型(如容器和智能指针)来管理动态资源。在这种情况下,vector<vector<int>>
可能是一个合适的选择。
我想真正的问题是“
delete
和delete[]
在幕后真的做了什么?”
如果对象类型有一个非平凡的析构函数,它会在释放内存之前调用每个对象上的析构函数。因此,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]
来索引数组。