C++ 用返回空向量的对象填充向量
我有一个成员函数,它用对象填充向量:C++ 用返回空向量的对象填充向量,c++,oop,vector,C++,Oop,Vector,我有一个成员函数,它用对象填充向量: std::vector<OptionData>& OptionData::createMeshExpiry(const double T_start, const double T_end, double T_increment) { // Ouput a vector filled with option data spread std::vector<OptionData> optData; m_T =
std::vector<OptionData>& OptionData::createMeshExpiry(const double T_start, const double T_end, double T_increment)
{ // Ouput a vector filled with option data spread
std::vector<OptionData> optData;
m_T = T_start; // intialize to first value
while(m_T <= T_end)
{
optData.push_back(*this); // push the current instance onto the vector
m_T += T_increment; // increment expiry time
}
return optData; // return by reference to enable a cascading effect (if needed to change more than one var)
}
无论while循环运行多少次,函数始终返回一个空向量。这意味着我的while循环什么都不做。这怎么可能
编辑:在玩了一段时间代码之后,我注意到问题是通过引用返回的。但为什么通过引用返回会导致此问题 您正在返回局部变量的引用,这就是问题所在。局部变量optData的作用域仅在函数内部,一旦到达函数的最后一个括号,系统将调用它的析构函数 所以需要进行修正,将其更改为按值返回,剩下的部分将处理NRVO。因此,按如下方式更改函数
std::vector<OptionData> OptionData::createMeshExpiry(const double T_start, const double T_end, double T_increment)
{
//....
}
您正在返回局部变量的引用,这就是问题所在。局部变量optData的作用域仅在函数内部,一旦到达函数的最后一个括号,系统将调用它的析构函数 所以需要进行修正,将其更改为按值返回,剩下的部分将处理NRVO。因此,按如下方式更改函数
std::vector<OptionData> OptionData::createMeshExpiry(const double T_start, const double T_end, double T_increment)
{
//....
}
谢谢,但是为什么引用返回会引起这个问题?@瑞恩C++引用总是弱引用。当它们指向的原始对象超出范围或被删除时,它们会变坏。如果需要更强的引用方案,可以考虑返回SysDypTR。但是,由于RVO,简单地按值返回是很快的。谢谢,但是为什么引用返回会引起问题?@ RANIC++引用总是弱引用。当它们指向的原始对象超出范围或被删除时,它们会变坏。如果需要更强的引用方案,可以考虑返回SysDypTR。但是,由于RVO的原因,简单地按值返回速度很快。请启用编译器警告,然后读取它们。这些警告正试图起到帮助作用。真的。离题:如果你知道你的向量需要有多大,并且你能有效地做到这一点,那么在向量前面初始化或保留足够的空间通常是个好主意。否则,您将得到大量的重新分配。请启用编译器警告,然后读取它们。这些警告正试图起到帮助作用。真的。离题:如果你知道你的向量需要有多大,并且你能有效地做到这一点,那么在向量前面初始化或保留足够的空间通常是个好主意。否则,您将得到大量的重新分配。