Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
White OwlayvangoА вот тут тогда почему всё работает? http://alenacpp.blogspot.ru/2008/01/const.html Потому что автор статьи видит звон, но не понимает где он. const там совершенно не причем. А вот то что строка задана как "abc" это важно. Тут скорее вы не разобрались. В примере по ссылке абсолютно не важно, как задана строка. Там важно только то, что возвращается не ссылка или указатель, а значение. В этом случае если на вызывающей стороне результат присвоить в ссылку, то возвращаемое значение сначала присваивается во временную переменную, время жизни которой продлевается до времени жизни ссылки, а ссылка ссылается на эту временную переменную, а не на значение созданное в функции (которое уничтожается сразу после присвоения во временную). При этом компилятору позволяется для оптимизации опускать избыточные копирования временных объектов если время жизни у копии совпадает с исходным объектом. Но это отдельная тема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2012, 00:36 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
MasterZivА так работает?пропущено... А так работает? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Нет. Хотя если тестировать, то иногда может казаться, что оно работает. Не нет, а да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2012, 00:43 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
А так работает?MasterZivпропущено... Нет. Хотя если тестировать, то иногда может казаться, что оно работает. Не нет, а да. Не да, а нет :) Все что я сказал не относится к случаю когда возвращается ссылка. MasterZiv правильно сказал - работать будет некорректно, но вы об этом узнаете когда уже будет поздно. При этом неважно во что присваивается результат. Ссылку/указатель можно возвращать только на объекты с временем жизни больше чем вызванная функция. Это: 1) глобальные и статические объекты 2) объекты созданные функцией в куче или другой глобальной памяти 3) объекты переданные в функцию извне (явно или неявно через состояние) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2012, 01:48 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
А так работает?MasterZivпропущено... Нет. Хотя если тестировать, то иногда может казаться, что оно работает. Не нет, а да. Это может только делать вид, что работает. Ссылка возвращаемая ссылается на объект, время жизни которого истекло и он уничтожен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2012, 09:06 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА так работает?пропущено... Не нет, а да. Не да, а нет :) Все что я сказал не относится к случаю когда возвращается ссылка. MasterZiv правильно сказал - работать будет некорректно, но вы об этом узнаете когда уже будет поздно. При этом неважно во что присваивается результат. Ссылку/указатель можно возвращать только на объекты с временем жизни больше чем вызванная функция. Это: 1) глобальные и статические объекты 2) объекты созданные функцией в куче или другой глобальной памяти 3) объекты переданные в функцию извне (явно или неявно через состояние) Не, на самом деле допустимо возвращать такие невалидные ссылки, но только при одном условии - что к этим объектам никогда не будет в программе обращения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2012, 09:09 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Про да и нет и эксперименты. Тут как в анекдоте про Чапая, Петьку, таракана и научные изыскания — далеко не всякий эксперимент может являться подтверждением правильности какой-то теории. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2012, 09:13 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА так работает?пропущено... Не нет, а да. Не да, а нет :) Все что я сказал не относится к случаю когда возвращается ссылка. MasterZiv правильно сказал - работать будет некорректно, но вы об этом узнаете когда уже будет поздно. При этом неважно во что присваивается результат. Ссылку/указатель можно возвращать только на объекты с временем жизни больше чем вызванная функция. Это: 1) глобальные и статические объекты 2) объекты созданные функцией в куче или другой глобальной памяти 3) объекты переданные в функцию извне (явно или неявно через состояние) А если объект возвращается по значению, то есть ли вообще смысл его присваивать ссылке? Можно просто его присвоить объекту и сработав RVO скомпилирует точно такой же код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2012, 15:38 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
А так работает?А если объект возвращается по значению, то есть ли вообще смысл его присваивать ссылке? Можно просто его присвоить объекту и сработав RVO скомпилирует точно такой же код. Ну во-первых, не все компиляторы и не во всех случаях умеют RVO. А во-вторых, не всегда при написании кода известно что функция вернет, ссылку или объект (например ожидается рефакторинг). В этом случае присваивать в ссылку оптимальнее, поскольку не требует копирования в случае если возвращается ссылка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2012, 17:11 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Всем ответчикам спасибо за ответы, вдумчиво прочитал Ваши комметарии и почти во всём разобрался. авторconst Example* f3(){ return new Example(3); } // компилируется, не работает. (нельзя будет удалить объект) А как подробно это объяснить (константные объекты создаются в особой области памяти, но возвращаемый объект просто расположен в куче, а из-за того, что указатель показывает на константный объект, нельзя вызвать деструктор)? Кстати, VS2010 нормально вызывает деструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2012, 11:27 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoпочти во всём разобрался. Ага, щас :) авторconst Example* f3(){ return new Example(3); } // компилируется, не работает. (нельзя будет удалить объект) А как подробно это объяснить (константные объекты создаются в особой области памяти, но возвращаемый объект просто расположен в куче, а из-за того, что указатель показывает на константный объект, нельзя вызвать деструктор)? Кстати, VS2010 нормально вызывает деструктор. Это абсолютно валидный код. И никаких проблем с удалением объекта созданного в куче через указатель на константный объект нет, поскольку это атрибут указателя, а не объекта. Другое дело стоит ли удалять объект если вам не разрешили его модифицировать. Возможно в будущем планируется как раз сделать его реально константным, или с многопоточным доступом. Но это уже ваше дело. И называйте вещи своими именами - в C++ вам скорее всего никогда не придется вызвать деструктор явно: pointer->~Example(). А delete pointer - это не вызов деструктора, а удаление объекта (в т.ч. как всего лишь одна из частей этого процесса будет неявно вызван деструктор) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2012, 13:45 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Про то, что не работает написал не я, я лишь пытаюсь во всём разобраться. А что означает фраза "сслыка продлевает жизнь временного объекта? Верны ли комментарии к коду? И исчерпывается ли фраза про продление жизни этим и другими похожими случаями? 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; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2012, 14:26 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
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(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2012, 15:47 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoExample f(){ return Example(0); } const Example& e1 = f(); // объект ВНУТРИ f() не удалился, пока на него указывает ссылка e1 нет, не так. при выходе из f() будет создан временный объект, куда скопируется возвращённый из функции результат. Если его не присваивать, то он сразу же разрушится, тоже автоматически. Но если его присвоить ссылке, то временный объект не будет разрушен до тех пор, пока существует эта ссылка на него. объект ВНУТРИ f() будет разрушен в любом случае, есть там снаружи ссылка или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.10.2012, 17:06 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite Owlпропущено... Потому что автор статьи видит звон, но не понимает где он. const там совершенно не причем. А вот то что строка задана как "abc" это важно. Тут скорее вы не разобрались. В примере по ссылке абсолютно не важно, как задана строка. Там важно только то, что возвращается не ссылка или указатель, а значение. В этом случае если на вызывающей стороне результат присвоить в ссылку, то возвращаемое значение сначала присваивается во временную переменную, время жизни которой продлевается до времени жизни ссылки, а ссылка ссылается на эту временную переменную, а не на значение созданное в функции (которое уничтожается сразу после присвоения во временную). При этом компилятору позволяется для оптимизации опускать избыточные копирования временных объектов если время жизни у копии совпадает с исходным объектом. Но это отдельная тема. А если тип ссылки - это базовый класс, а присваивается ей объект наследованного класса возвращенный из функции по значению, то не будет утечек памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2012, 20:52 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
без утечек памяти?А если тип ссылки - это базовый класс, а присваивается ей объект наследованного класса возвращенный из функции по значению, то не будет утечек памяти? Не будет утечек. Т.к. временная переменная куда присваивается результат функции всегда имеет тип этого результата. А ссылки на эту переменную на корректность ее уничтожения не влияют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2012, 21:15 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyбез утечек памяти?А если тип ссылки - это базовый класс, а присваивается ей объект наследованного класса возвращенный из функции по значению, то не будет утечек памяти? Не будет утечек. Т.к. временная переменная куда присваивается результат функции всегда имеет тип этого результата. А ссылки на эту переменную на корректность ее уничтожения не влияют. Ясно. http://alenacpp.blogspot.ru/2008/01/const.html Кстати, вот рассказывают что обязательно const нужен для ссылки на временный объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2012, 01:54 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ссылки на временный объект http://alenacpp.blogspot.ru/2008/01/const.html Кстати, вот рассказывают что обязательно const нужен для ссылки на временный объект. const нужен, потому что стандарт не разрешает приваивать временные значения в неконстантные ссылки, а не из-за технических каких-то причин. А компиляторы которые попускают такое просто не придерживаются стандарта. Например VS6 много чего не по стандарту делал, да и следующие версии тоже, хоть и постепенно фиксят это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2012, 07:09 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Такой вариант понятен: Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. А в данном случае возвращаемый объект является временным и продлевается ли его жизнь?: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2013, 17:24 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
в данном случае, Неважно что там внутри функции. Речь про другие временные объекты - те, куда присаиваются результаты вызова функции перед инициализацией ими ссылки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2013, 19:24 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
в данном случае А в данном случае возвращаемый объект является временным и продлевается ли его жизнь?: Код: plaintext 1. 2. 3. 4. 5. 6. В данном случае из функии также возвращается временный объект. При выходе из функции переменная s копируется в новый временный объект и возвращается. Снаружи функции тут также происходит продление времени жизни временного объекта, возвращённого из функции. Всегда, когда функция возвращает что-то по значению, возвращается временный объект (также в широком смысле слова, включая встроенные типы типа int, double и т.д.). Также всегда, когда из функции возвращается временный объект и им инициализируется ссылка (она обязана быть константной), продлевается время жизни этого временного объекта до выхода из области дейсвия ссылки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2013, 12:44 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38020492&tid=2020516]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
170ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 291ms |

| 0 / 0 |
