c++ - 在动态分配的多维数组之后清理

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

因此,我已将内存动态分配给二维数组:

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;

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

最佳答案

一般来说,你需要匹配每一个newdelete因此,如果像这里一样,您正在处理整个原始指针数组,那么您确实需要依次删除每个指针。

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

I guess the real question is "What does delete and delete[] really do behind the scene?"

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

关于c++ - 在动态分配的多维数组之后清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21402278/

相关文章:

c++ - 使用 Boost 舍入到 C++ 中最接近的数字?

c++ - 在附加数据库的空表/ View 中查找 SQLite 列名

Javascript:将字符串拆分为匹配参数的数组

c++ - 指针数学与数组索引

c++ - 在没有信道数据包丢失的传输中未收到数据包的原因?

c++ - 32 位共享对象的链接问题

java - 如何将字符串数组转换为唯一值数组?

html - Angular 6 : How to use an array in template syntax with ngFor?

c - 我是否误解了这个关于字符串文字范围的例子?

java - Java 中的引用。两个例子,有什么区别?