C++/传递值导致#DEN
C++ / Pass by value results in #DEN
用Visual Studio调试一些代码时,我惊讶地发现,在调用方法之前,对象的属性值看起来很棒,然后一输入方法就被破坏了:
电话是从这里打来的。调试器报告thingA.property = 0.14
method1()
{
Thing thingA;
object.method2(thingA)
}
并进入此处,调试器报告thingMine.property = 4.0E-315#DEN
method2(Thing thingMine)
{
....
}
当我将作用域改回method1
时,属性看起来很好,而将作用域更改回method2
时,属性的值会大不相同。
什么会导致价值发生变化?回到使用C的旧时代,我可以通过摆弄指针来破坏内存。然而,这个代码并没有什么特别之处。没有(显式(指针。编译器对所有对象的类型转换/类都很满意。没有花哨的继承或重载。
更详细地说,Thing
不仅仅是一个具有属性和方法的类。它的属性是对象,但仍然不是很花哨:
class Thing {
public:
AnotherThing thingInsideAThing;
...
}
AnotherThing
的性质正受到破坏。
我对传递值的理解是基于我在C中的古老教育。我认为调用一个方法会将thingA
的显式副本推送到堆栈上。它是否将thingA.object
的坏地址推送到堆栈上?我认为传递值总是将信息转发到方法中最安全的方式。
我从哪里开始理解根本问题?
我相信答案是通过Visual Studio显示对象的值的方式找到的
- 按值传递
- 通过常数参考
下面的代码为a
指定了正确的值。但是,对于我的对象,当我要求它显示thing.x
时,调试器会报告#DEN
。
method(Thing thing)
{
double a = thing.x;
}
然而,当我写:
method(const Thing& thing)
{
double a = thing.x;
}
调试器报告CCD_ 12的期望值。
我认识到按值传递和通过常量引用之间存在差异。然而,就我的情况而言,我认为没有实际的区别。