Ссылка на ссылку функции С++
Вот еще один вопрос n00b:
Почему я не могу/не должен возвращать рефезию локальной переменной в функцию? Это потому, что временная переменная автоматически уничтожается после завершения функции?
const string & wrap(string & s1, const string & s2){
string temp;
temp = s2 + s1 + s2;
return temp;
}
Как насчет этого:
const string & wrap2(const string & s1, const string & s2){
return (s2 + s1 + s2);
}
Ответы
Ответ 1
Переменные, объявленные локально внутри функций, выделяются в стеке. Когда функция возвращается к вызывающей стороне, пространство в стеке, где переменная, используемая для проживания, исправляется и больше не используется, а переменные, которые там были, больше не существуют (ну, но они не могут их использовать, и они могут быть перезаписывается в любое время). Так что да, в основном то, что вы сказали.
Ответ 2
Это точно. Локальная переменная переходит в poof и уничтожается, когда она выходит за пределы области видимости. Если вы вернете ссылку или указатель на нее, эта ссылка или указатель укажет на мусор, так как объект больше не будет существовать.
Ответ 3
"Как насчет этого:..."
s2 + s1 + s2
сам является временной локальной переменной, поэтому он также не может быть возвращен ссылкой.
Что вы могли бы сделать - но, пожалуйста, не делайте этого, это утечка памяти! - есть
const string & wrap2(const string & s1, const string & s2){
string *pt = new string(s2+s1+s2);
return *pt;
}
Это создает глобально допустимую строку, которая затем может передаваться по ссылке, поскольку она не уничтожается после завершения функции. Фактически, он никогда не уничтожается и будет занимать пространство до тех пор, пока программа работает: вы, вероятно, этого не хотите!
Если это не ссылка const
, вы можете, однако, delete
выполнить ее вручную.
EDIT:, поэтому оказывается, что вы даже можете удалить ссылку на const, но опять же - это не очень приятно делать.
Ответ 4
Как и предыдущие плакаты, это связано с тем, что локальные переменные попадают в стек. Эта физическая память может быть передана другому фрейму функции и изменена, все, пока вы указатель, все еще висит на том же месте (которое теперь изменено). Я не уверен, но я не думаю, что он "уничтожен", но он, безусловно, не защищен от изменения любых будущих распределений стека.