以下是我如何分配它:
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[]
外部阵列?
答案 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 ++中使用new
和delete
。有关详细信息,请参阅我的回答:Malloc vs New for Primitives
如果您正在编写需要高性能矩阵实现的程序,请不要创建自己的程序。您的代码和我使用std::vector
的示例都具有缓存不友好的锯齿状布局,这会严重损害性能。考虑使用高质量的生产就绪库,例如Eigen,Blaze或BLAS。