Отладка некоторого кода в 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
в стек? Я думал, что передача по значению была всегда самым безопасным способом передачи информации в метод.
Где я могу начать понимать основную проблему?