gpt4 book ai didi

C++ - 无法从函数返回 vector

转载 作者:行者123 更新时间:2023-11-30 02:31:06 26 4
gpt4 key购买 nike

假设如下函数

std::vector<double> LocatePulseEdges(int points, double* signal_x, double* signal_y, double threshold, vector<double> left_edge, vector<double> right_edge){
cout << "1" << endl;
for (int i=0; i<points; i++){
if(signal_y[i]<threshold){// left side of the pulse
left_edge.push_back(signal_x[i]);
break;
}
if(signal_y[i]>threshold){// right side of the pulse
right_edge.push_back(signal_x[i]);
break;
}
}
cout << "6" << endl;
return left_edge;
//return right_edge;

cout << "7" << endl;
}

我在下面的代码中调用了这个函数

void Analyze(){
int points = 90000000;//hSignal->GetNbinsX();
double* x = new double[points]; // SIZE limited only by OS/Hardware
double* y = new double[points];
std::vector<double> left;
std::vector<double> right;
double threshold = 6234.34;

Function_to_Fill_X_and_Y();
LocatePulseEdges(points, x, y, threshold, left, right);
cout << "First left threshold crossing @ time : " << left[0] << endl;
}

虽然我没有遇到编译错误,但当我运行程序时,它在返回语句之前崩溃了。

知道为什么会这样吗?

最佳答案

LocatePulseEdges 中有几个缺陷函数,以及 Analyze功能。

首先,如果您要使用 std::vector<double>在代码的一部分中,为什么不在整个代码中使用它?你有:

void Analyze()
{
//...
double* x = new double[points];
double* y = new double[points];
//...
}

除非您已调用 delete [] xdelete [] y ,这个函数有内存泄漏。你可以简单地使用

std::vector<double> x(points), y(points);

并在填充它们的函数中,传递 x.data()y.data()如果使用 C++11,否则,&x[0]&y[0] .这减轻了内存泄漏。

即使你确实有 delete []在某处,如果抛出异常,即 delete []可能被绕过,造成泄漏。使用 std::vector , vector即使在异常情况下也会被销毁。


其次,对于LocatePulseEdges函数,通过 (const) 引用而不是值传递 vector 。此外,不需要按值返回 vector 。如果您在函数内创建一个全新的 vector ,那么可能这将证明返回新 vector 是合理的,但您并没有这样做。所以返回 void .

void LocatePulseEdges(int points, double* signal_x, double* signal_y, double threshold, vector<double>& left_edge, vector<double>& right_edge)
{
//...
}

当您按值传递 vector 时,会生成 vector 的拷贝,所以您是 left_edge.push_back()调用正在使用一个临时的,而不是您传递的实际 vector 。这就是为什么在返回时, vector left_edge是空的。


最后,检查 vector::empty()如果您要访问 vector 中的第一项。您不能只是假设该项目存在于 vector 中。

   LocatePulseEdges(points, x.data(), y.data(), threshold, left, right);
if ( !left.empty() )
cout << "First left threshold crossing @ time : " << left[0] << endl;
else
cout << "No threshold's generated" << endl;

上面的代码假定您采纳了使用 std::vector<double> 的建议对于 xy变量。

关于C++ - 无法从函数返回 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38008961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com