我是一个初级程序员,我有一个关于函数的问题,这个函数返回一个指向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倍的内存?
是否存在这样的方法(从函数返回指向数组的指针并在循环中使用该函数)?
谢谢你的进阶。
发布于 2015-05-26 03:01:23
我认为编写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
}发布于 2015-05-26 02:58:28
为了避免内存泄漏,您需要在获得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;
}发布于 2015-05-26 03:15:19
你问:
每次我使用"myfunction“(在while-循环中)时,我都为变量"s”保留内存,这意味着如果执行while-循环5次,那么程序为变量s保留5倍的内存?
答案是是。
你还问:
是否存在这样的方法(从函数返回指向数组的指针并在循环中使用该函数)?
答案是是。您需要添加代码来删除返回的内存,
while( /*some condition */){
s = myfunction(x,y, 2);
// Use s
// Now delete s.
delete[] s;
}一个比处理new和delete更好的解决方案是从myfunction返回一个std::vector。那么,您就不需要担心内存的管理。那是the answer by Barray
https://stackoverflow.com/questions/30448688
复制相似问题