Codepad.org c++代码给出错误的结果
Codepad.org C++ code gives wrong result
有个小问题:
你能告诉我这段代码有什么问题吗?它应该输出9
,但是它输出了4.8921e-270
,然而,当取消注释第4行时,它也工作得很好。
我不明白这是怎么回事。谢谢!
double& foo() {
double x = 9;
double &y = x;
//cout << y << "n";
return y;
}
int main() {
cout << foo() << "n";
}
结果:4.8921e-270
返回指向堆栈上对象的引用/指针是坏的主意。当您离开函数时,它们可能会被破坏。试着按值返回:
double foo() {
double x = 9;
double &y = x;
//cout << y << "n";
return y;
}
现在返回值是复制的而不是一个可能已经不存在的对象的引用。
您正在返回对本地对象的引用,当foo
完成时该对象不再存在,然后当您取消引用它时,您将获得未定义行为
double foo() {
double x = 9;
double &y = x;
//cout << y << "n";
return y;
}
返回对堆栈上对象的引用从来都不是一个好主意。当你离开函数时,它们很可能就消失了。您可以尝试按值返回。
返回对局部变量的引用-由于局部变量在foo()返回时超出了作用域,因此该值不再存在。
因此,您应该将返回类型更改为double(强烈建议)并返回x,或者(如果您绝对想要/必须返回引用)使用静态变量代替:
double& foo() {
static double x = 9;
double &y = x;
return y;
}
我通常通过const ref:
返回类的数据成员class BigThing {...};
class Foo
{
public:
const BigThing & getBT() const { return bt; } // For constant BigThing.
BigThing & getBT() { return bt; } // For mutable BigThing.
private:
BigThing bt;
};
那么只要你的Foo实例在作用域中(你不想返回一个ref到一个局部变量),那么使用getBT()应该是安全有效的。
相关文章:
- 如何修复循环中的错误产生的错误结果?
- 添加可变参数函数的错误结果
- 使用特征 3 线性系统求解器的错误结果
- 按位包含 OR 的错误结果
- 如果我将索引变量更改为零,并且合并函数中的k = 0,则获得合并排序的错误结果
- STD :: FPCLASSIFY的错误结果使用Valgrind进行长时间的双重双重结果
- 视觉工作室的错误结果
- 将C#struct传递给C 不受管理的DLL返回错误结果
- 最长的常见子字错误结果
- 华氏度到摄氏度的错误结果
- UE4中简单坐标变换的错误结果
- 记忆错误结果的说明[编译器行为]
- 如何解决错误PRJ0002:错误结果 -1073741515从"cl.exe"返回?
- 错误 PRJ0002:错误结果 -1073741515 从"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.
- glGetUniformLocation OpenGL ES 2.0(在ipad 3 iOS 7.0.3上返回错误结果)
- 在模板函数中调用std::for_each时出现错误结果
- 使用copy和back_inserter将矢量附加到其自身时出现错误结果
- CUDA 线程在全局内存中的私有位置写入时出现错误结果
- 来自 c++ 代码的错误结果
- 使用浮点值和铸造的算术运算的错误结果 - 差异很大,我想这不是准确值的情况(429497)?