Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Допустим, есть какая-то функция.Предполагается, что поток только один. 1)Может ли она возвращать указатель на объект, созданный внутри неё? 2)Меняет ли что-то, если объект статический, создан внутри ф-и? Те же вопросы для случая, когда возвращается указатель на константу либо константный указатель. Те же вопросы для случая, когда возвращается ссылка. Те же вопросы для случая, когда возвращается ссылка на константу. На вопрос 2) я бы ответил, что возвращать ссылку на статический объект, определённый внутри ф-и можно во всех случаях, только надо следить, чтобы всё корректно работало. А что с 1) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 11:34 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Если объект создан динамически (в куче), то можно, если на стеке, то нельзя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 11:39 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Есть облась жизни, есть облась видимости. Тут надо проверять область жизни. Все созданное на стеке живет только до выхода из функции. Созданное в динамической памяти, в пулах живет пока не будет освобождено. Поэтому возвращать можно. Если памать, кончено, не освобождается внутри функции. Статические пременные живут вечно. Так что указатели на них также можно возвращать. Для однопоточных приложений вполне толковый механизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 12:22 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Cerebrum и vromanov, Правильно ли я понял, что все Ваши ответы следует понимать следующим образом: При возвращении константного/неконстантного указателя/ссылки на статический объект, определённый внутри функции, всё будет работать нормально, если всё правильно записать? При возвращении константного/неконстантного указателя/ссылки на нестатический объект надо, чтобы нестатический объект создавался в куче? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 12:48 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvango, Да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 13:49 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Спасибо, кажется, разобрался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 13:54 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
А Вы пишите, что если объект не является статическим, он должен создаваться в куче. Но вот пример ... std::string f(){ return "abc"; } ... const std::string& s = f(); ... Здесь всё нормально, а объект не является статическим. Как это объяснить? И почему то же самое не верно для указателей? const std::string* const ps = f(); -- почему не хочет компилироваться (компилится лишь при использовании new для выделения памяти)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 14:25 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoА Вы пишите, что если объект не является статическим, он должен создаваться в куче. Но вот пример ... std::string f(){ return "abc"; } ... const std::string& s = f(); ... Здесь всё нормально, а объект не является статическим. Как это объяснить? И почему то же самое не верно для указателей? const std::string* const ps = f(); -- почему не хочет компилироваться (компилится лишь при использовании new для выделения памяти)? В первом случае, когда функция производит возврат, создается копия возвращаемого объекта Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В случае указателя Код: plaintext 1. 2. 3. 4. 5. Память по которой расположен result жива пока выполняется функция Add. Как только произошел возврат из Add все переменные созданные на стеке в функции Add разрушаются, а значит адрес result, теперь указывает на какой-то абстрактный мусор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 14:45 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Спасибо, если я правильно понял, то в случае с ссылкой на константу передаётся копия созданного объекта, а внутренний объект разрушен, но всё равно всё работает, передаётся-то объект, а не обломки, а в случае с константным указателем на кностанту передаются обломки (указатель на разрушенный объект), потому всё и отказывается компилироваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 14:54 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoСпасибо, если я правильно понял, то в случае с ссылкой на константу передаётся копия созданного объекта, а внутренний объект разрушен, но всё равно всё работает, передаётся-то объект, а не обломки, а в случае с константным указателем на кностанту передаются обломки (указатель на разрушенный объект), потому всё и отказывается компилироваться.Нет. Если писать так: Код: plaintext 1. 2. 3. 4. 5. , то тоже получится фигня. Смотрите на то, что возвращает функция, а не на то, чему это возвращаемое значение присваивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 18:35 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoДопустим, есть какая-то функция. Предполагается, что поток только один. 1)Может ли она возвращать указатель на объект, созданный внутри неё? Да. ayvango2)Меняет ли что-то, если объект статический, создан внутри ф-и? Т.е. может ли функция вернуть указатель на статический объект, область видимости которого -- эта функция ? Да, может. Вообще, функция в С++, которая возвращает по своей сигнатуре указатель какого-то типа, может возвращать любое валидное выражение типа "указатель на этот тип", С++ никак не ограничивает функцию ни в чём. Другое дело, что по семантике например бессмысленно возвращать указатель на автоматический объект, созданный в этой функции -- он будет удалён по выходу из этой функции, и указатель автоматом станет невалидным. ayvangoТе же вопросы для случая, когда возвращается указатель на константу либо константный указатель. Те же вопросы для случая, когда возвращается ссылка. Те же вопросы для случая, когда возвращается ссылка на константу. Ничем в общем не отличается от возврата указателя. Любое валидное выражение этого типа может быть возвращено. Но это не значит, что это имеет всегда смысл. Это я к тому, что возможно ты неправильно сформулировал вопрос. Лучше было бы, если бы ты привёл все интересующие тебя варианты кода, тогда можно было бы их прокомментировать и сказать, где имеет смысл так делать, а где нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 21:06 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
CerebrumЕсли объект создан динамически (в куче), то можно, если на стеке, то нельзя Что значит нельзя ? Можно, но просто он уже станет невалидным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 21:07 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoА Вы пишите, что если объект не является статическим, он должен создаваться в куче. Но вот пример ... std::string f(){ return "abc"; } ... const std::string& s = f(); ... Здесь всё нормально, а объект не является статическим. Как это объяснить? Ну здесь -то нет указателей, здесь объект по значению возвращается. Им инициализируется константная ссылка, это по стандарту продлевает жизнь временного объекта на время жизни этой ссылки. ayvango И почему то же самое не верно для указателей? const std::string* const ps = f(); -- почему не хочет компилироваться (компилится лишь при использовании new для выделения памяти)? Не хочет компилироваться -- потому что ты указатель инициализируешь объектом, а не его адресом. Это если функция f выглядит как std::string f(){ return "abc"; } если же как std::string* f(){ return new std::string("abc"); } то проблема в том, что указатель НЕ продлевает время жизни объекта, в отличие от ссылки. Но собвтсенно и объект-то не возвращается, возвращается указатель на него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 21:13 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoСпасибо, если я правильно понял, то в случае с ссылкой на константу передаётся копия созданного объекта, а внутренний объект разрушен, но всё равно всё работает, передаётся-то объект, а не обломки, а в случае с константным указателем на кностанту передаются обломки (указатель на разрушенный объект), потому всё и отказывается компилироваться. Понял ты неправильно. Ссылка или указатель -- всё равно. Важно, что функция возвращает. Если ссылку или указатель, это не влияет на время жизни объекта, которым они проинициализированы при возврате. Если значение -- то значение и возвращается, при этом объект копируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 21:17 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
AbstractionayvangoСпасибо, если я правильно понял, то в случае с ссылкой на константу передаётся копия созданного объекта, а внутренний объект разрушен, но всё равно всё работает, передаётся-то объект, а не обломки, а в случае с константным указателем на кностанту передаются обломки (указатель на разрушенный объект), потому всё и отказывается компилироваться.Нет. Если писать так: Код: plaintext 1. 2. 3. 4. 5. , то тоже получится фигня. Смотрите на то, что возвращает функция, а не на то, чему это возвращаемое значение присваивается. А так работает? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2012, 21:46 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
MasterZivЛучше было бы, если бы ты привёл все интересующие тебя варианты кода, тогда можно было бы их прокомментировать и сказать, где имеет смысл так делать, а где нет. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. в VisualStudio всё копмилируется, только вот для f1() и f2() стоят предупреждения о возвращении ссылки на локальную переменную. Вопрос в том, будет ли это корректно работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 06:31 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoв VisualStudio всё копмилируется, только вот для f1() и f2() стоят предупреждения о возвращении ссылки на локальную переменную. Вопрос в том, будет ли это корректно работать?Нет, не будет. Добавь в свой класс деструктор с printf/cout, добавь после каждой команды в своем примере печать строк "сделано это" и посмотри когда именно вызываются деструкторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 16:38 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
посмотри когда именно вызываются деструкторы Деструкторы для e1 и e2 вызываются почти сразу же, причём сначала вызывается деструктор для e1, затем для e2. Означает ли это, что при выходе из ф-и f1() и f2() соответственно соответствующие объекты уничтожаются несмотря на то, что на них указывает ссылка? Почему ссылка не продлевает время жизни объекта? И почему для встроенных типов (int) случаи со ссылками работают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 18:36 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoпосмотри когда именно вызываются деструкторы Деструкторы для e1 и e2 вызываются почти сразу же, причём сначала вызывается деструктор для e1, затем для e2. Означает ли это, что при выходе из ф-и f1() и f2() соответственно соответствующие объекты уничтожаютсяДа. ayvango несмотря на то, что на них указывает ссылка?Ссылки и указатели никак не влияют на время жизни объектов. ayvangoИ почему для встроенных типов (int) случаи со ссылками работают?А они не работают. Ссылка на уничтоженный int продолжает существовать и до тех пор пока никому не понадобилось место где раньше был записан этот int в той ячейке памяти будет записано старое значение. И его даже можно будет использовать.... Но как только другая функция потребует память - твоя ссылка начнет показывать на память занятую совсем другим значением. У элементарных типов нету деструкторов поэтому ты просто не видишь когда они уничтожаются, но на самом деле правила уничтожения и у объектов и у элементарных типов одинаковые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 20:46 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 21:04 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvangoА вот тут тогда почему всё работает? http://alenacpp.blogspot.ru/2008/01/const.html Потому что автор статьи видит звон, но не понимает где он. const там совершенно не причем. А вот то что строка задана как "abc" это важно. Задние констант в коде это совершенно отдельная тема. Задумайся, где эта строка "abc" хранится? В куче или на стеке? Что происходит когда я пишу: Код: plaintext 1. 2. 3. ? Компилятор самопроизвольно добавит конструктор string? или strcpy? Где лежит "abc"? Может ли она быть затерта вызовом другой функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 21:55 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
А так работает?Abstractionпропущено... Нет. Если писать так: Код: plaintext 1. 2. 3. 4. 5. , то тоже получится фигня. Смотрите на то, что возвращает функция, а не на то, чему это возвращаемое значение присваивается. А так работает? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Нет. Хотя если тестировать, то иногда может казаться, что оно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 22:49 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvango Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Вообще при таких проблемах часто нужно подумать о возврате объекта по значению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 22:59 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
ayvango в VisualStudio всё копмилируется, только вот для f1() и f2() стоят предупреждения о возвращении ссылки на локальную переменную. Вопрос в том, будет ли это корректно работать? Это не должно компилироваться по стандарту. Если студия это жрет, это проблемы частного компилятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 23:03 |
|
||
|
Объясните раз и навсегда про возвращение из функции указателя и ссылки
|
|||
|---|---|---|---|
|
#18+
Означает ли это, что при выходе из ф-и f1() и f2() соответственно соответствующие объекты уничтожаются несмотря на то, что на них указывает ссылка? Да. Почему ссылка не продлевает время жизни объекта? Ссылка может продлить время жизни только локального временного объекта, а тут ты выходишь из функции вообще. Верни объект по значению, он скопируется наружу, и все будет ок. И почему для встроенных типов (int) случаи со ссылками работают? Не работают и так, и так. Если ты гоняеш тесты какие то, то это тебе только кажется, что оно работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 23:13 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38016344&tid=2020516]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
74ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 190ms |

| 0 / 0 |
