从 C++ 中的函数返回指向数组的指针?
Posted
技术标签:
【中文标题】从 C++ 中的函数返回指向数组的指针?【英文标题】:Return a pointer to array from a function in 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<double> s(myfunction(x,y,2));
,但老实说,我会从一开始就使用std::vector
来处理此代码中的所有动态分配。
x = 1, 1
的语法是否有效?
@WhozCraig 应该是std::unique_ptr<double[]>
?
@songyuanyao 是的,可能。刚吃完晚饭回来给了一杯大小适中的玛格丽塔酒=P
【参考方案1】:
你问:
每次我使用“myfunction”(在while循环中)时,我都会为变量“s”保留内存,这意味着如果while循环执行5次,那么程序会为变量“s”?
答案是是的。
你还问过:
有没有办法做到这一点(从函数返回指向数组的指针并在循环中使用该函数)??
答案是是的。需要添加代码删除返回的内存,
while( /*some condition */)
s = myfunction(x,y, 2);
// Use s
// Now delete s.
delete[] s;
比处理new
和delete
更好的解决方案是从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;
【讨论】:
以上是关于从 C++ 中的函数返回指向数组的指针?的主要内容,如果未能解决你的问题,请参考以下文章
C++指针问题,请问如何定义一个返回值为结构体指针数组的函数?