【问题标题】:Return a pointer to array from a function in C++?从 C++ 中的函数返回指向数组的指针?
【发布时间】:2015-08-07 13:05:17
【问题描述】:

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

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

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倍的内存“?

有没有办法做到这一点(从函数返回指向数组的指针并在循环中使用该函数)??

先谢谢你了。

【问题讨论】:

  • std::unique_ptr&lt;double&gt; s(myfunction(x,y,2));,但老实说,我会从一开始就使用std::vector 来处理此代码中的所有动态分配。
  • x = {1, 1} 的语法是否有效?
  • @WhozCraig 应该是std::unique_ptr&lt;double[]&gt;
  • @songyuanyao 是的,可能。刚吃完晚饭回来给了一杯大小适中的玛格丽塔酒=P

标签: c++ arrays function pointers return


【解决方案1】:

你问:

每次我使用“myfunction”(在while循环中)时,我都会为变量“s”保留内存,这意味着如果while循环执行5次,那么程序会为变量“s”?

答案是是的

你还问过:

有没有办法做到这一点(从函数返回指向数组的指针并在循环中使用该函数)??

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

  while( /*some condition */){
    s = myfunction(x,y, 2);

    // Use s

    // Now delete s.
    delete[] s;
  }

比处理newdelete 更好的解决方案是从myfunction 返回std::vector。然后,您无需担心管理内存。那是the answer by Barray

【讨论】:

    【解决方案2】:

    我想说写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
    }
    

    【讨论】:

      【解决方案3】:

      为避免内存泄漏,您需要在获取后立即使用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;
      
          }
      

      【讨论】:

        猜你喜欢
        • 2017-03-22
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 2022-11-21
        • 2020-04-29
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        相关资源
        最近更新 更多