因此,我已将内存动态分配给二维数组:
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;
如果我需要为每个 new
语句调用一次 delete
,有没有办法重写我的代码,这样我只需要一个 delete
声明?
最佳答案
一般来说,你需要匹配每一个new
用delete
因此,如果像这里一样,您正在处理整个原始指针数组,那么您确实需要依次删除每个指针。
如果 new
之间的代码,这将是一个严重的麻烦和 delete
并不简单,而且几乎不可能确保它是否会抛出异常。因此,您应该始终使用 RAII容器和智能指针等类型来管理动态资源。在这种情况下,vector<vector<int>>
可能是一个合适的选择。
I guess the real question is "What does
delete
anddelete[]
really do behind the scene?"
如果对象类型有一个非平凡的析构函数,它会在释放内存之前对每个对象调用该析构函数。因此 RAII 类型将自动释放它们通过析构函数管理的任何资源;但是原始指针没有析构函数,因此删除它们不会释放它们指向的任何内存。
关于c++ - 在动态分配的多维数组之后清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21402278/