Подтвердить что ты не робот

Ссылка на ссылку функции С++

Вот еще один вопрос 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);  
}
4b9b3361

Ответ 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

Как и предыдущие плакаты, это связано с тем, что локальные переменные попадают в стек. Эта физическая память может быть передана другому фрейму функции и изменена, все, пока вы указатель, все еще висит на том же месте (которое теперь изменено). Я не уверен, но я не думаю, что он "уничтожен", но он, безусловно, не защищен от изменения любых будущих распределений стека.