我刚刚学会了如何正确返回一个数组Return a 2d array from a function,但是如果我想要执行类似下面的操作,如何释放返回数组的内存
dMAT=matmul(DIM,transpose(DIM,EState),dMAT);
其中Matmul和Transpose都是用户定义的函数,返回2D数组。从现在开始使用Matmul和Transpose,我没有处理返回的数组,因此无法在所述方法中释放内存。
编辑:
下面给出了Matmul和Transpose的一个例子,
double **transpose(int & dim, double ** mat){
double **mat1 = new double *[dim];
for(int i=0; i<dim; i++) {
mat1[i] = new double [dim];
for(int j=0; j<dim; j++) mat1[i][j] = mat[j][i];
}
return mat1;
}
double **matmul(int & dim, double ** mat1, double **mat2){
double **mat3 = new double *[dim];
for(int i=0; i<dim; i++) {
mat3[i] = new double [dim];
for(int j=0; j<dim; j++) {
mat3[i][j]=0.0;
for(int k=0; k<dim; k++) mat3[i][j]+=mat1[i][k]*mat2[k][j];
}
}
return mat3;
}
答案 0 :(得分:1)
你可以做出类似的事情:
double *f(const int& size)
{
double *arr = new double[size];
for (int i=0;i<size;i++)
arr[i] = i;
return arr;
}
int main()
{
double *a = f(10);
delete []a;
}
它不适用于2D阵列,但我认为您理解主要想法
答案 1 :(得分:1)
您使用了一个类,它封装了分配和释放。
像
这样的东西class matrix {
std::vector<std::vector<double>> mat;
public:
matrix(int dim) : mat(dim, std::vector(std::vector(dim))) {}
// Other members, e.g. transpose, operator+ and operator*
};
或者,不是自己编写,而是使用像Eigen这样为您编写的库。
答案 2 :(得分:0)
使用std::vector
它可以为您节省很多麻烦。
在您的代码中,如果没有可以调用delete的临时变量,则无法释放内存。 std::vector
(以及其他包装器)将通过管理资源的生命周期(此处为内存)来帮助您。
使用C样式编码(使用new
和delete
进行手动内存管理)不是用C ++编写代码的方法:它很难,你会编写错误的代码。从头开始学习优秀的C ++编码风格(RAII,...)。
答案 3 :(得分:0)
我刚学会了如何正确返回一个数组
由于无法按值返回数组,因此精确有用:您已经学会了如何返回一个指针,该指针包含作为数组元素的对象的地址。 / p>
如何释放返回数组的内存
您通过拨打new[]
分配了内存。因此,您必须通过调用delete[]
来释放内存。通过传递delete[]
返回的地址作为参数来使用new[]
。
既然您希望使用指针不仅用于释放内存,还要将其传递给另一个函数matmul
(或有时matmul
?),您将希望将指针存储在变量,以便您可以复制它:
auto arr = transpose(DIM,EState);
dMAT = matmul(DIM,arr,dMAT);
// now, you can release the memory pointed by arr
然而,不要通过将动态记忆存储在裸指针中来拍摄自己。请改用std::vector
等RAII容器。