C++/传递值导致#DEN

C++ / Pass by value results in #DEN

本文关键字:#DEN C++      更新时间:2023-10-16

用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的期望值。

我认识到按值传递通过常量引用之间存在差异。然而,就我的情况而言,我认为没有实际的区别。