gpt4 book ai didi

C++:如何避免 vector 从方法返回后被销毁?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:22 25 4
gpt4 key购买 nike

我正在尝试为 Polynomial 类重载除法运算符 /,但算法本身是无关紧要的。问题是当我出于某种未知原因尝试返回多项式时,C++ 似乎正在破坏我的多项式。

这是类(class)的相关部分:

class Polynomial
{
public:
.........
Polynomial &operator/(const double &) const;
private:
int DEGREE;
std::vector<double> poly_terms; // stores the polynomial coefficients
.........
}

这是我无法正常工作的方法:

Polynomial &Polynomial::operator/(const double &rhs) const
{
Polynomial result(10); //create new polynomial object with a maximum degree of 10
double buffer;

for(int i = 0; i <= DEGREE; i++)
{
buffer = poly_terms[i]; //poly_terms is of type vector<double>
result.setCoeff(i, buffer / rhs); //this method assigns (buffer / rhs) to the i-th index of result's vector data-member.
}
return result; //return Polynomial instance
}

就在 return 子句执行之前,调试器显示 result 对象的所有数据成员都正确设置了它们的值,因为算法应该设置它们,包括 vector 数据成员。所以在 return 返回之前,result 是 100% 正确构建的,因此该方法的逻辑到目前为止看起来很好。

但是在 return 语句执行后,一切都失败了。由于某种原因,返回的对象将其 vector 数据成员更改为空的 vector (奇怪的是,所有其他不是对象的数据成员,如 DEGREE ,保持原样)。我不确定它是否是同一个 vector 对象以某种方式被清空,或者它是否是包含此 vector 对象的多项式对象的失败拷贝。

有谁知道为什么会发生这种情况以及如何避免这种情况?

更新 1:我应该提一下,我还尝试使用 new 在此方法中创建 Polynomial 对象。我还尝试通过删除 & 来不返回引用,因此具有类似 Polynomial Polynomial::operator/(const double &rhs) const 的 header 。但是这两者都对 vector 数据成员产生了类似的不良影响。

更新 2:感谢那些提到我不应该返回引用的人,我似乎能够找到问题所在。问题在于需要重载复制构造函数和重载赋值运算符以手动执行 vector 数据成员的复制(不确定是否需要两者,我只是实现了所有这三个东西,现在它完美地工作) .感谢大家帮助解决这个问题。

最佳答案

嗯,你返回一个局部变量的引用。任何将使用该变量的代码都将是未定义的行为。您的情况有一个简单的解决方案:删除 &

// Notice that the function is not returning a reference anymore
Polynomial Polynomial::operator/(const double &rhs) const
{
Polynomial result(10); //create new polynomial object with a maximum degree of 10
double buffer;

for(int i = 0; i <= DEGREE; i++)
{
buffer = poly_terms[i]; //poly_terms is of type vector<double>
result.setCoeff(i, buffer / rhs); //this method assigns (buffer / rhs) to the i-th index of result's vector data-member.
}
return result; //return Polynomial
}

您可能认为它会减慢您的代码,因为它会复制变量 result。这是错误的。您的代码将使用复制省略。这意味着没有从返回语句中复制。

即使您的编译器很笨并且不会使用复制省略,它也会使用您的类的移动构造函数,而且它仍然比复制快得多。

要阅读有关复制省略的更多信息,请查看此处的文档页面:Copy elision

关于C++:如何避免 vector 从方法返回后被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39859880/

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