繁体   English   中英

如何在C ++中为2D数组正确地释放内存?

[英]How to properly deallocate memory for a 2d array in C++?

这是我的分配方式:

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[]外部数组?

delete[] 总是new[]配对。

delete 总是new配对。

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

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

如何在C ++中为2D数组正确地释放内存?

不手动。 使用RADstd::array类的抽象,如std::vector ,如果您知道编译时矩阵的大小,则可以使用std::array

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

// memory automatically freed at the end of the scope

在Modern C ++中, 几乎永远不要使用newdelete 有关更多信息,请参见我的答案: Malloc与原始函数的新增功能


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM