如何在C ++中正确释放2d数组的内存?

时间:2017-12-12 12:55:28

标签: c++ memory-management

以下是我如何分配它:

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[]外部阵列?

2 个答案:

答案 0 :(得分:4)

delete[] 始终new[]配对。

delete 始终new配对。

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

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

答案 1 :(得分:1)

  

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

不是手动。使用像std::vector这样的抽象,感谢RAII,或者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 vs New for Primitives

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