Форум программистов, компьютерный форум CyberForum.ru

Возврат указателя на локальный объект - C++

Восстановить пароль Регистрация
 
yrceus
 Аватар для yrceus
80 / 80 / 54
Регистрация: 25.08.2013
Сообщений: 321
03.07.2016, 15:44     Возврат указателя на локальный объект #1
Доброго дня! Заинтересовал процесс возврата указателя на локальный объек, а именно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
char* fun() {
    char *ptr1 = "Hello world!";
    return ptr1;
}
 
 
int main()
{
    char *ptr = fun();
    cout << ptr << end;
    return 0;
}
Вопрос, почему так работает? Вернули же указатель на локальный объект... Адрес строки был в стеке и после выхода из функции должен был освободиться. Правильно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
03.07.2016, 15:52     Возврат указателя на локальный объект #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
yrceus, здесь нет локального объекта, кроме самого указателя, который естественно копируется при возврате. Строковый литерал имеет статическое размещение (static storage duration) и живет до конца выполнения программы.

Добавлено через 2 минуты
А вот так делать как раз нельзя:
C++
1
2
3
4
char* fun() {
    char arr[] = "Hello world!";
    return arr;
}
Здесь у нас локальный массив, адрес первого элемента возвращается из функции. Вот здесь действительно будет UB.
yrceus
 Аватар для yrceus
80 / 80 / 54
Регистрация: 25.08.2013
Сообщений: 321
03.07.2016, 15:53  [ТС]     Возврат указателя на локальный объект #3
Спасибо за полный ответ! Понял!))))
meJevin
 Аватар для meJevin
153 / 145 / 56
Регистрация: 18.11.2015
Сообщений: 600
Завершенные тесты: 1
03.07.2016, 16:14     Возврат указателя на локальный объект #4
DrOffset, а почему UB? У него же static storage duration, он сидит в одном блоке памяти до конца программы. Еще говорят, что most likely, string literals will be stored in read-only segments of memory since they never change. Т.е. его перезаписать нельзя. Или я пургу несу и ничего не понял
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
03.07.2016, 16:22     Возврат указателя на локальный объект #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
meJevin, в первом примере от автора UB нет. Там адрес строкового литерала используется для инициализации указателя.
В моем примере UB есть, потому что там создается массив на стеке, для инициализации которого используется строковый литерал, а в массиве соответственно копия этого литерала.
Yandex
Объявления
03.07.2016, 16:22     Возврат указателя на локальный объект
Ответ Создать тему
Опции темы

Текущее время: 12:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru