![]() |
|
Модераторы: bsa |
![]()
|
|
| C/L |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
Здравствуйте. Прочитал много инфы по ссылкам но так и не разобрался. В общем если имеется некоторая функция
Второй вариант работает, но то что было с "new" надо где то "delete". А что если эту функцию использовать как параметр другой, тогда возможности запустить где-то delete вообще не будет. Для теста написал прогу:
На выходе получаем 3 живых объекта Create exx #1 Copy exx #2 Delete exx #2 Create exx #3 Copy exx #4 Delete exx #4 Create exx #5 Copy exx #6 Delete exx #6 1: Hi! I'm exist! My name: 1 2: Hi! I'm not exist! My name: 13920463 3: Hi! I'm exist! My name: 3 4: Hi! I'm not exist! My name: 13920463 5: Hi! I'm exist! My name: 5 6: Hi! I'm not exist! My name: 13920463 |
||||
|
|||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
C/L, Вопрос-то в чем?
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
оба варианта неправильные, в первом случае ты возвращаешь ссылку на локальную переменную, которая после выхода из ф-ии перестанет существовать, ну а ссылка будет на несуществующий объект.
во втором случае, ты возвращаешь ссылку, там, где нужно вернуть указатель, конечно, можно вернуть и ссылку, но так никто не делает, так-как для того, что-бы потом удалить объект, все-равно нужен будет указатель |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
используй std::auto_ptr
|
|||
|
||||
| C/L |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
Поясню вопрос: можно ли создать внутри функции и вернуть по ссылке объект так, чтобы выйдя за пределы видимости он (объект) самоуничтожился, или точнее чтобы компилятор сгенерировал код уничтожения. Ведь в отличие от указателя, ссылка может ссылаться только на один объект и компилятор может отследить область ее видимости.
azesmcar, спасибо, попробую |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
именно так и происходит, если создадите локальный объект, то выйдя за пределы видимости функции он уничтожится, и пользовать его нельзя будет - поэтому компилятор и против возвращения ссылки на него. Поэтому нужно возвращать либо копию, либо умный указатель (auto_ptr, shared_ptr, ... в зависимости от потребностей) Добавлено через 1 минуту и 6 секунд P.S.можно еще вернуть ссылку на аргумент, переданный по ссылке. |
|||
|
||||
| C/L |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
Да, согласен. Но я имел ввиду обасть видимости той переменной, куда эта ссылка вернется. Так ведь происходит когда мы вызываем конструктор. Например для моей тестовой программы:
выдает: Create exx #1 Delete exx #1 Create exx #2 Delete exx #2 Create exx #3 Delete exx #3 1: Hi! I'm not exist! My name: 3 2: Hi! I'm not exist! My name: 3 3: Hi! I'm not exist! My name: 3 Значит вместо функции надо писать конструктор??? А разве с функцией такое не может никак получится??? Это сообщение отредактировал(а) C/L - 25.2.2009, 10:36 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| C/L |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
Кажется до меня дошло: чтобы объект сам уничтожился он должен быть в стеке а не в куче. И создать его в таком случае может только конструктор без оператора new. А у каждой функции свой кусок стека для локальных переменных, поэтому вернуть адрес такого объекта нельзя как и ссылку на него вернуть тоже нельзя.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Именно так. Но можно создавать объект в куче, а другим объектом определять его время жизни - и тогда можно будет добиться того поведения, о корором спрашивали. В постах выше приведены варианты, какие средства могут помочь достичь этой цели |
|||
|
||||
| C/L |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 31.7.2004 Где: Самара Репутация: нет Всего: 1 |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |