Какие могут быть проблемы при возвращении ссылки на локальный указатель функции?

Чем возвращение локального указателя по ссылке:

#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 шт):

Автор решения: Harry

В случае int* foo() возвращается значение, хранящееся в переменной; судьба самой переменной ни на что не влияет и никого не интересует — это копия значения, которое после завершения функции исчезает вместе с переменной.

В случае int*& foo() возвращается ссылка на переменную, по сути — ее адрес (по крайней мере я не знаю компиляторов, где это не так), и чтобы получить само значение указателя, надо разыменовать возвращенный указатель. Указатель на что? На переменную, которой уже нет. Ее время жизни завершилось вместе с функцией, место в памяти, где она была, уже может быть чем-то перезаписано.

int*& foo() в этом смысле аналог int** foo(). С последней функцией вам понятно, в чем проблемы?

→ Ссылка