Codepad.org C ++ код дает неверный результат - PullRequest
1 голос
/ 04 октября 2011

Просто крошечный вопрос:

Можете ли вы сказать мне, в чем проблема здесь в этом коде? Он должен распечатать 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

Ответы [ 5 ]

8 голосов
/ 04 октября 2011

Это плохая идея вернуть ссылки / указатели на объекты в стеке. Они, вероятно, уничтожаются, когда вы выходите из функции. Попробуйте вернуть его согласно значению:

double foo() {
  double x = 9;
  double &y = x;
  //cout << y << "\n";
  return y;
}

Теперь возвращаемое значение скопировано вместо ссылки на объект, который, вероятно, больше не существует.

4 голосов
/ 04 октября 2011

Вы возвращаете ссылку на локальный объект, объект перестает существовать, когда завершается foo, а затем вы получаете неопределенное поведение при разыменовании.

1 голос
/ 04 октября 2011
double foo() {
  double x = 9;
  double &y = x;
  //cout << y << "\n";
  return y;
}

Никогда не стоит возвращать ссылки на объекты в стеке. Скорее всего, они исчезнут, когда вы выйдете из функции. Вы можете попытаться вернуть его согласно значению.

0 голосов
/ 04 октября 2011

Я часто возвращаю данные членов класса по 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 находится в области видимости (вы не хотите возвращать ссылку на локальную переменную), тогда использование одного из getBT () должно быть безопасным и эффективным.

0 голосов
/ 04 октября 2011

Вы возвращаете ссылку на локальную переменную - поскольку локальная переменная выходит из области действия, как только возвращается функция foo (), значение больше не существует.

Таким образом, вы должны либо просто изменить тип возвращаемого значения на double (настоятельно рекомендуется) и вернуть x, либо (если вы абсолютно хотите / должны вернуть ссылку) вместо этого использовать статическую переменную:

double& foo() {
  static double x = 9;
  double &y = x;
  return y;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...