C ++ / Передача по значению приводит к #DEN - PullRequest
0 голосов
/ 03 ноября 2018

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

Где я могу начать понимать основную проблему?

1 Ответ

0 голосов
/ 05 ноября 2018

Я полагаю, что ответ найден в том, как Visual Studio отображает значения для объектов, которые

  • передать по значению
  • передать по постоянной ссылке

Приведенный ниже код присваивает правильное значение a. Однако для моего объекта отладчик сообщает #DEN, когда я прошу его отобразить thing.x.

method(Thing thing)
  {
    double a = thing.x;
  }

Однако, когда я пишу:

method(const Thing& thing)
  {
    double a = thing.x;
  }

отладчик сообщает ожидаемое значение для thing.x.

Я понимаю, что существует разница между передачей по значению и передачей по постоянной ссылке . Однако в моем случае я не думаю, что есть практическая разница.

...