【问题标题】:How to properly deallocate memory for a 2d array in C++?如何在 C++ 中正确释放二维数组的内存?
【发布时间】:2017-12-12 12:55:28
【问题描述】:

我是这样分配的:

float** matrix = new float*[size];
for (int i = 0; i < size; i++) {
    matrix[i] = new float[size];
}

这就是我如何解除分配:

if (matrix != nullptr) {
    for (int i = 0; i < size; i++) {
        delete[] matrix[i];
    }
}
free(matrix);

这是正确的还是我也应该delete[]外部数组?

【问题讨论】:

  • 每个new 需要匹配一个delete,每个new[] 需要匹配一个delete[]
  • 为什么不使用 std::vector?
  • @GauravSehgal:绝对不是。
  • 哦是的..我的坏..我在想什么。@Bathsheba 谢谢。
  • 大概,您应该使用 new 来创建外部数组,所以是的,调用 delete[] 将是释放它的方法。

标签: c++ memory-management


【解决方案1】:

delete[]总是new[]配对。

delete总是new配对。

所以是的,在您的情况下,您需要调用 delete[] matrix; 来释放 float* 指针数组。 不要使用free,除非该指针已通过调用malloc 等获得,这在C++ 中是不常见的。

虽然,如果您想在数学意义上对矩阵进行建模,那么我建议您使用第三部分库。我使用 BLAS,它是 Boost 发行版的一部分。

【讨论】:

  • delete[] matrix;delete matrix[];有区别吗?
  • @CrasherX:是的,我的方式是一个错字。哎呀。
  • newdelete 本身是“C++ 中不寻常的”。
  • @VittorioRomeo:这就解释了为什么我的初稿中的 delete[] 语法不正确 ;-)
  • 这是怎么得到这么多赞成的?这是一个 [c++] 问题 - 提到在 C++ 中严重不鼓励手动内存管理应该是第一个答案。然后你可以了解如果你真的想让你的生活变得困难,你应该如何将new/delete 配对
【解决方案2】:

如何在 C++ 中为二维数组正确释放内存?

不是手动的。使用std::vector 之类的抽象,感谢RAIIstd::array,如果您在编译时知道矩阵的大小,它会为您释放内存。

{
    std::vector<std::vector<float>> matrix(size);
    for(auto& v : matrix) v.resize(size);
}

// memory automatically freed at the end of the scope

您应该几乎从不在现代 C++ 中使用 newdelete。更多信息请参考我的回答:Malloc vs New for Primitives


如果您正在编写一个需要高性能矩阵实现的程序,请不要自己创建。您的代码和我使用std::vector 的示例都具有缓存不友好的锯齿状布局,这会严重损害性能。考虑改用高质量的生产就绪库,例如 Eigen、Blaze 或 BLAS。

【讨论】:

  • 永远不要说永远。仍然存在使用 std::vector 不够快的情况。我可以认为实时信号处理就是这样一个例子(例如实时频谱图显示)。
  • 我不认为这更好。每次我看到一个锯齿状结构建模矩阵时,我都会在里面死去。
  • @Bathsheba:我不反对,但问题不在于最佳矩阵内存布局。问题是关于内存管理,对于初学者来说,这比缓存友好性更重要!
  • @dsp_user:当然,当您知道自己在做什么时。您是否忘记了 OP 是一个初学者,他在 C++ 中寻求配对 new/delete 的帮助?
  • 没错。如果从不教导初学者不要将new[]free() 混合使用,您认为初学者如何成长为某些容器类的成功提供者?
猜你喜欢
  • 2015-05-10
  • 2016-03-15
  • 2010-12-16
  • 1970-01-01
  • 2016-01-08
  • 2018-10-05
  • 2020-05-10
  • 2011-08-05
  • 2014-11-05
相关资源
最近更新 更多