从c++函数返回指向数组的指针

Return a pointer to array from a function in C++?

本文关键字:数组 指针 c++ 函数 返回      更新时间:2023-10-16

我是一名初级程序员,我有一个关于在c++中返回双精度数组指针的函数的问题。该函数接受两个数组,并将每个元素相加,就像vector和一样。

我认为正确的做法是....

double *myfunction(double *x, double *y, int n){
  double *r = new double[n];
  for(int i=0;i<n;i++){
    r[i] = x[i]+y[i];
  }
  return r;
}

问题是我在主函数的while循环中使用了这个函数,就像这样

int main(){
  double *x, *y, *s;
  x = new double[2];
  y = new double[2];
  x = {1,1};
  y = {2,2};
  while(/*some condition */){
    /*some process...*/
    s = myfunction(x,y, 2);
    /*some process...*/
  }
  delete[] x;
  delete[] y;
  delete[] s;
}

我的问题是内存泄漏怎么办?每次我使用"myfunction"(在while循环内)时,我为变量"s"保留内存,这意味着如果while循环执行5次,那么程序为变量"s"保留5倍的内存?

是否有一种方法可以做到这一点(从函数返回指向数组的指针并在循环中使用该函数)??

提前谢谢。

为了避免内存泄漏,您需要在获得s后立即使用它,并在完成后删除它。

 int main(){
      double *x, *y, *s;
      x = new double[2];
      y = new double[2];
      x = {1,1};
      y = {2,2};
      while(//some condition ){
        s = myfunction(x,y, 2);
        //do some process here
        delete[] s;
      }
      delete[] x;
      delete[] y;
    }

我想说myfunction更正确的写法是:

std::vector<double> myfunction(double *x, double *y, int n){
  std::vector<double> r;
  r.reserve(n);
  for(int i=0;i<n;i++){
    r.push_back(x[i]+y[i]);
  }
  return r;
}

这样,你就不必担心内存泄漏,你的while循环可以只是:

while (/* some condition*/) {
    std::vector<double> s = myfunction(x, y, 2);
    // whatever
}

你问:

每次我使用"myfunction"(在while-loop内)时,我为变量"s"保留内存,这意味着如果while-loop执行5次,那么程序为变量"s"保留5倍的内存?

答案是

你还问:

是否有一种方法可以做到这一点(从函数返回指向数组的指针并在循环中使用该函数)??

答案是。您需要添加代码来删除返回的内存,

  while( /*some condition */){
    s = myfunction(x,y, 2);
    // Use s
    // Now delete s.
    delete[] s;
  }

一个比必须处理newdelete更好的解决方案是从myfunction返回std::vector。然后,您就不需要担心内存的管理。这就是Barray的答案