Сообщение 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
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.
C>>>Проблема в том, что по выходе из foo литерал, похоже умер. Во всяком случа в foo()[0] — мусор.
C>>>Хочу понять, ошибка компилятора или моя.
R>>Умер не литерал, а объект класса record, вместе с инкапсулированным указателем.
C>Но, функция возвращает указатель именно на литерал.
C>Какая разница в каких живых и мертвых объектах побывала копия этого указателя?
Так она возвращает его уже после того, как владеющий объект record уже умер. И на том месте, где раньше был указатель, находится стековый мусор:
https://ideone.com/Igl57i
То, что в программа по ссылке выводит "ожидаемое" значение — просто случайность. UB — оно и в африке UB.