powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объясните раз и навсегда про возвращение из функции указателя и ссылки
20 сообщений из 45, страница 2 из 2
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38017875
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlayvangoА вот тут тогда почему всё работает?

http://alenacpp.blogspot.ru/2008/01/const.html Потому что автор статьи видит звон, но не понимает где он.
const там совершенно не причем. А вот то что строка задана как "abc" это важно.
Тут скорее вы не разобрались.

В примере по ссылке абсолютно не важно, как задана строка.

Там важно только то, что возвращается не ссылка или указатель, а значение.
В этом случае если на вызывающей стороне результат присвоить в ссылку, то возвращаемое значение сначала присваивается во временную переменную, время жизни которой продлевается до времени жизни ссылки, а ссылка ссылается на эту временную переменную, а не на значение созданное в функции (которое уничтожается сразу после присвоения во временную).

При этом компилятору позволяется для оптимизации опускать избыточные копирования временных объектов если время жизни у копии совпадает с исходным объектом. Но это отдельная тема.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38017877
MasterZivА так работает?пропущено...


А так работает?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int& Add(int a, int b)
{
	int result = a+b;
	return result;
}

int main() {
 int &res = Add(1, 2);
 std::cout << res;
}



Нет. Хотя если тестировать, то иногда может казаться, что оно работает.
Не нет, а да.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38017891
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так работает?MasterZivпропущено...


Нет. Хотя если тестировать, то иногда может казаться, что оно работает.
Не нет, а да.
Не да, а нет :)
Все что я сказал не относится к случаю когда возвращается ссылка.
MasterZiv правильно сказал - работать будет некорректно, но вы об этом узнаете когда уже будет поздно.
При этом неважно во что присваивается результат.

Ссылку/указатель можно возвращать только на объекты с временем жизни больше чем вызванная функция.
Это:
1) глобальные и статические объекты
2) объекты созданные функцией в куче или другой глобальной памяти
3) объекты переданные в функцию извне (явно или неявно через состояние)
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38018039
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так работает?MasterZivпропущено...


Нет. Хотя если тестировать, то иногда может казаться, что оно работает.
Не нет, а да.

Это может только делать вид, что работает.
Ссылка возвращаемая ссылается на объект, время жизни которого истекло и он уничтожен.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38018040
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА так работает?пропущено...

Не нет, а да.
Не да, а нет :)
Все что я сказал не относится к случаю когда возвращается ссылка.
MasterZiv правильно сказал - работать будет некорректно, но вы об этом узнаете когда уже будет поздно.
При этом неважно во что присваивается результат.

Ссылку/указатель можно возвращать только на объекты с временем жизни больше чем вызванная функция.
Это:
1) глобальные и статические объекты
2) объекты созданные функцией в куче или другой глобальной памяти
3) объекты переданные в функцию извне (явно или неявно через состояние)

Не, на самом деле допустимо возвращать такие невалидные ссылки, но только при одном условии - что к этим объектам никогда не будет в программе обращения.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38018044
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про да и нет и эксперименты.
Тут как в анекдоте про Чапая, Петьку, таракана и научные изыскания — далеко не всякий эксперимент может являться подтверждением правильности какой-то теории.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38018886
Anatoly MoskovskyА так работает?пропущено...

Не нет, а да.
Не да, а нет :)
Все что я сказал не относится к случаю когда возвращается ссылка.
MasterZiv правильно сказал - работать будет некорректно, но вы об этом узнаете когда уже будет поздно.
При этом неважно во что присваивается результат.

Ссылку/указатель можно возвращать только на объекты с временем жизни больше чем вызванная функция.
Это:
1) глобальные и статические объекты
2) объекты созданные функцией в куче или другой глобальной памяти
3) объекты переданные в функцию извне (явно или неявно через состояние)
А если объект возвращается по значению, то есть ли вообще смысл его присваивать ссылке?
Можно просто его присвоить объекту и сработав RVO скомпилирует точно такой же код.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38019090
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так работает?А если объект возвращается по значению, то есть ли вообще смысл его присваивать ссылке?
Можно просто его присвоить объекту и сработав RVO скомпилирует точно такой же код.
Ну во-первых, не все компиляторы и не во всех случаях умеют RVO.
А во-вторых, не всегда при написании кода известно что функция вернет, ссылку или объект (например ожидается рефакторинг). В этом случае присваивать в ссылку оптимальнее, поскольку не требует копирования в случае если возвращается ссылка.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38019772
ayvango
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем ответчикам спасибо за ответы, вдумчиво прочитал Ваши комметарии и почти во всём разобрался.

авторconst Example* f3(){ return new Example(3); } // компилируется, не работает. (нельзя будет удалить объект)
А как подробно это объяснить (константные объекты создаются в особой области памяти, но возвращаемый объект просто расположен в куче, а из-за того, что указатель показывает на константный объект, нельзя вызвать деструктор)? Кстати, VS2010 нормально вызывает деструктор.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38020063
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ayvangoпочти во всём разобрался.
Ага, щас :)
авторconst Example* f3(){ return new Example(3); } // компилируется, не работает. (нельзя будет удалить объект)
А как подробно это объяснить (константные объекты создаются в особой области памяти, но возвращаемый объект просто расположен в куче, а из-за того, что указатель показывает на константный объект, нельзя вызвать деструктор)? Кстати, VS2010 нормально вызывает деструктор.
Это абсолютно валидный код.
И никаких проблем с удалением объекта созданного в куче через указатель на константный объект нет, поскольку это атрибут указателя, а не объекта.

Другое дело стоит ли удалять объект если вам не разрешили его модифицировать. Возможно в будущем планируется как раз сделать его реально константным, или с многопоточным доступом. Но это уже ваше дело.

И называйте вещи своими именами - в C++ вам скорее всего никогда не придется вызвать деструктор явно: pointer->~Example().
А delete pointer - это не вызов деструктора, а удаление объекта (в т.ч. как всего лишь одна из частей этого процесса будет неявно вызван деструктор)
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38020141
ayvango
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про то, что не работает написал не я, я лишь пытаюсь во всём разобраться.

А что означает фраза "сслыка продлевает жизнь временного объекта? Верны ли комментарии к коду? И исчерпывается ли фраза про продление жизни этим и другими похожими случаями?

Example f(){ return Example(0); }

int main()
{
const Example& e1 = f(); // объект ВНУТРИ f() не удалился, пока на него указывает ссылка e1
Example e2 = f(); // объект ВНУТРИ f() удалился, а с помощью копирующего присваивания создался объект e2
Example e3(f()); // объект ВНУТРИ f() удалился, а помощью копирующего конструктора создался объект e3
return 0;
}
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38020349
ayvangoПро то, что не работает написал не я, я лишь пытаюсь во всём разобраться.

А что означает фраза "сслыка продлевает жизнь временного объекта? Верны ли комментарии к коду? И исчерпывается ли фраза про продление жизни этим и другими похожими случаями?

Example f(){ return Example(0); }

int main()
{
const Example& e1 = f(); // объект ВНУТРИ f() не удалился, пока на него указывает ссылка e1
Example e2 = f(); // объект ВНУТРИ f() удалился, а с помощью копирующего присваивания создался объект e2
Example e3(f()); // объект ВНУТРИ f() удалился, а помощью копирующего конструктора создался объект e3
return 0;
}
В выделенных может сработать RVO и конструкторы не вызовутся, а просто код соптимизируется до:
Example e2 = Example(0);
Example e3(Example(0));

Выделенные строчки одно и то же - конструктор копирования. Если хотите использовать оператор присваивания, то нужно так:
Example e3;
e3 = f();
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38020492
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ayvangoExample f(){ return Example(0); }
const Example& e1 = f(); // объект ВНУТРИ f() не удалился, пока на него указывает ссылка e1
нет, не так. при выходе из f() будет создан временный объект, куда скопируется возвращённый из функции результат. Если его не присваивать, то он сразу же разрушится, тоже автоматически. Но если его присвоить ссылке, то временный объект не будет разрушен до тех пор, пока существует эта ссылка на него.
объект ВНУТРИ f() будет разрушен в любом случае, есть там снаружи ссылка или нет.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38024028
Anatoly MoskovskyWhite Owlпропущено...
Потому что автор статьи видит звон, но не понимает где он.
const там совершенно не причем. А вот то что строка задана как "abc" это важно.
Тут скорее вы не разобрались.

В примере по ссылке абсолютно не важно, как задана строка.

Там важно только то, что возвращается не ссылка или указатель, а значение.
В этом случае если на вызывающей стороне результат присвоить в ссылку, то возвращаемое значение сначала присваивается во временную переменную, время жизни которой продлевается до времени жизни ссылки, а ссылка ссылается на эту временную переменную, а не на значение созданное в функции (которое уничтожается сразу после присвоения во временную).

При этом компилятору позволяется для оптимизации опускать избыточные копирования временных объектов если время жизни у копии совпадает с исходным объектом. Но это отдельная тема.
А если тип ссылки - это базовый класс, а присваивается ей объект наследованного класса возвращенный из функции по значению, то не будет утечек памяти?
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38024059
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без утечек памяти?А если тип ссылки - это базовый класс, а присваивается ей объект наследованного класса возвращенный из функции по значению, то не будет утечек памяти?
Не будет утечек.
Т.к. временная переменная куда присваивается результат функции всегда имеет тип этого результата.
А ссылки на эту переменную на корректность ее уничтожения не влияют.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38024241
Anatoly Moskovskyбез утечек памяти?А если тип ссылки - это базовый класс, а присваивается ей объект наследованного класса возвращенный из функции по значению, то не будет утечек памяти?
Не будет утечек.
Т.к. временная переменная куда присваивается результат функции всегда имеет тип этого результата.
А ссылки на эту переменную на корректность ее уничтожения не влияют.
Ясно.

http://alenacpp.blogspot.ru/2008/01/const.html
Кстати, вот рассказывают что обязательно const нужен для ссылки на временный объект.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38024285
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ссылки на временный объект http://alenacpp.blogspot.ru/2008/01/const.html
Кстати, вот рассказывают что обязательно const нужен для ссылки на временный объект.
const нужен, потому что стандарт не разрешает приваивать временные значения в неконстантные ссылки, а не из-за технических каких-то причин.
А компиляторы которые попускают такое просто не придерживаются стандарта. Например VS6 много чего не по стандарту делал, да и следующие версии тоже, хоть и постепенно фиксят это.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38112648
Такой вариант понятен:
Код: plaintext
1.
2.
3.
4.
5.
string f() { 
 return string("abc"); // это временный объект
}

string const& a = f();



Код: plaintext
1.
2.
3.
string f() { return "abc"; } // аналогично

string const& a = f();



А в данном случае возвращаемый объект является временным и продлевается ли его жизнь?:
Код: plaintext
1.
2.
3.
4.
5.
6.
string f() { 
string s = "abc"; // уже не временный объект
s += "def";
return s; }

string const& a = f();
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38112871
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в данном случае,

Неважно что там внутри функции.
Речь про другие временные объекты - те, куда присаиваются результаты вызова функции перед инициализацией ими ссылки.
...
Рейтинг: 0 / 0
Объясните раз и навсегда про возвращение из функции указателя и ссылки
    #38113699
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в данном случае
А в данном случае возвращаемый объект является временным и продлевается ли его жизнь?:

Код: plaintext
1.
2.
3.
4.
5.
6.
string f() { 
string s = "abc"; // уже не временный объект
s += "def";
return s; }

string const& a = f();




В данном случае из функии также возвращается временный объект.
При выходе из функции переменная s копируется в новый временный объект и возвращается.

Снаружи функции тут также происходит продление времени жизни временного объекта, возвращённого из функции.

Всегда, когда функция возвращает что-то по значению, возвращается временный объект (также в широком смысле слова, включая встроенные типы типа int, double и т.д.).
Также всегда, когда из функции возвращается временный объект и им инициализируется ссылка (она обязана быть константной), продлевается время жизни этого временного объекта до выхода из области дейсвия ссылки.
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объясните раз и навсегда про возвращение из функции указателя и ссылки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]