Информация об изменениях

Сообщение Re[5]: Время жизни строковых литералов от 07.03.2019 13:48

Изменено 07.03.2019 13:50 rg45

Re[5]: Время жизни строковых литералов
Здравствуйте, Chorkov, Вы писали:

C>>>Проблема в том, что по выходе из foo литерал, похоже умер. Во всяком случа в foo()[0] — мусор.

C>>>Хочу понять, ошибка компилятора или моя.

R>>Умер не литерал, а объект класса record, вместе с инкапсулированным указателем.


C>Но, функция возвращает указатель именно на литерал.

C>Какая разница в каких живых и мертвых объектах побывала копия этого указателя?

Так она возвращает его уже после того, как владеющий объект record уже умер. И на том месте, где раньше был указатель, находится стековый мусор:

https://ideone.com/Igl57i
Re[5]: Время жизни строковых литералов
Здравствуйте, Chorkov, Вы писали:

C>>>Проблема в том, что по выходе из foo литерал, похоже умер. Во всяком случа в foo()[0] — мусор.

C>>>Хочу понять, ошибка компилятора или моя.

R>>Умер не литерал, а объект класса record, вместе с инкапсулированным указателем.


C>Но, функция возвращает указатель именно на литерал.

C>Какая разница в каких живых и мертвых объектах побывала копия этого указателя?

Так она возвращает его уже после того, как владеющий объект record уже умер. И на том месте, где раньше был указатель, находится стековый мусор:

https://ideone.com/Igl57i

То, что в программа по ссылке выводит "ожидаемое" значение — просто случайность. UB — оно и в африке UB.