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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
yrceus
 Аватар для yrceus
80 / 80 / 54
Регистрация: 25.08.2013
Сообщений: 322
#1

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

03.07.2016, 15:44. Просмотров 170. Ответов 4
Метки нет (Все метки)

Доброго дня! Заинтересовал процесс возврата указателя на локальный объек, а именно:
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;
}
Вопрос, почему так работает? Вернули же указатель на локальный объект... Адрес строки был в стеке и после выхода из функции должен был освободиться. Правильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2016, 15:44     Возврат указателя на локальный объект
Посмотрите здесь:

C++ Возврат указателя на строку из фукнции
Возврат указателя на массив из функции C++
Создание указателя на объект и выделение памяти C++
C++ Возврат функцией указателя на функцию
C++ Происхродит ли здесь возврат указателя на не действительную память?
C++ Возврат указателя
C++ Удаление указателя на объект класса
Возврат указателя на массив указателей C++
Возврат указателя на массив из функции C++
C++ Присвоение переменной поля указателя на объект
C++ Возвращение ссылки на локальный объект
C++ Указатель на объект из указателя на член класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
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
Сообщений: 322
03.07.2016, 15:53  [ТС]     Возврат указателя на локальный объект #3
Спасибо за полный ответ! Понял!))))
meJevin
 Аватар для meJevin
154 / 146 / 57
Регистрация: 18.11.2015
Сообщений: 623
Завершенные тесты: 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
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
03.07.2016, 16:22     Возврат указателя на локальный объект #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
meJevin, в первом примере от автора UB нет. Там адрес строкового литерала используется для инициализации указателя.
В моем примере UB есть, потому что там создается массив на стеке, для инициализации которого используется строковый литерал, а в массиве соответственно копия этого литерала.
Yandex
Объявления
03.07.2016, 16:22     Возврат указателя на локальный объект
Ответ Создать тему
Опции темы

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