Какие могут быть проблемы при возвращении ссылки на локальный указатель функции?
Чем возвращение локального указателя по ссылке:
#include <iostream>
using namespace std;
int*& foo()
{
int* pointer = new int{ 10 };
return pointer;
}
int main()
{
int* point = foo();
}
Отличается от возвращения копии этого указателя:
#include <iostream>
using namespace std;
int* foo()
{
int* pointer = new int{ 10 };
return pointer;
}
int main()
{
int* point = foo();
}
Ответы (1 шт):
В случае int* foo() возвращается значение, хранящееся в переменной; судьба самой переменной ни на что не влияет и никого не интересует — это копия значения, которое после завершения функции исчезает вместе с переменной.
В случае int*& foo() возвращается ссылка на переменную, по сути — ее адрес (по крайней мере я не знаю компиляторов, где это не так), и чтобы получить само значение указателя, надо разыменовать возвращенный указатель. Указатель на что? На переменную, которой уже нет. Ее время жизни завершилось вместе с функцией, место в памяти, где она была, уже может быть чем-то перезаписано.
int*& foo() в этом смысле аналог int** foo(). С последней функцией вам понятно, в чем проблемы?