Вернуться по ссылке - PullRequest
3 голосов
/ 15 января 2011

Пожалуйста, смотрите следующие фрагменты кода.Во второй функции я возвращаю ссылку.Я объявляю локальную переменную в функции и возвращает адрес.Поскольку переменная является локальной, я считаю, что ее жизнь заканчивается, когда она выходит из функции.Мой вопрос: почему можно получить доступ к значению от вызывающего без каких-либо исключений, даже если исходная переменная удалена?

Ответы [ 5 ]

7 голосов
/ 15 января 2011

Поведение второй функции просто undefined ; может случиться что угодно, и во многих случаях это будет работать просто потому, что ничего не перезаписано там, где результат хранился в стеке.

2 голосов
/ 15 января 2011

Нет, вы не должны этого делать.Результат доступа к остаточным данным в стеке не определен.Кроме того, если ваше возвращаемое значение относится к типу класса, его деструктор уже будет вызван.

Вы пытаетесь избежать временных объектов?Если это так, вы можете быть заинтересованы в этом:http://en.wikipedia.org/wiki/Return_value_optimization

2 голосов
/ 15 января 2011

Исходное значение не удаляется.Просто потому, что действие по его удалению вызовет некоторые невидимые вычисления.

Значение все еще там, но пространство памяти больше не ваше и фактически не определено.

Вы указываете напространство в памяти, которое может быть переполнено программой.

2 голосов
/ 15 января 2011

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

Память, вероятно, все еще содержит данные, хотя, похоже, она работает должным образом, но, вероятно, будет использоваться повторно в любое время, и значение будет перезаписано.

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

0 голосов
/ 15 января 2011

Скорее всего, он не будет работать в следующих случаях:

funcMulRef(10,3) + funcMulRef(100,500)

альтернативно, более отвратительным образом:

std::cout << "10*3=" << funcMulRef(10,3) << " 100*500=" << funcMulRef(100,500) << std::endl;

gcc будет предупреждать о таких ошибках, если выиспользовать -Wall

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...