在运行中使用返回的数组,如何释放其内存?

时间:2017-05-22 13:13:13

标签: c++ function memory multidimensional-array

我刚刚学会了如何正确返回一个数组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;

 }

4 个答案:

答案 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(以及其他display in TextView包装器)将通过管理资源的生命周期(此处为内存)来帮助您。

使用C样式编码(使用newdelete进行手动内存管理)不是用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容器。