![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Есть класс, который генерит древовидную структуру используя обычные указателями. Структура довольно сложная и громоздкая, я боюсь где-то могу забыть прописать удаление указателя в деструкторе класса. Посему назрела мысль использовать "умников-стрелочников". Но насколько я понял пободные смартпоинтеры действуют по принципу - вышли из области видимости - сработал деструктор и сами удалились. Но у меня ситуация такая, в конструкторе создаются указатели, но при выходе из конструктора они должны остаться валидными и удалиться только в деструкторе моего класса. Как в таком случае применить смарт-поинтеры если их участь - подохнуть точно также как локальный объект созданный во временном стеке, теряется смысл ?
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Всё зависит от типа умного указателя. Далеко не все общедоступные реализации "умирают" при выходе из области видимости. Например boost::shared_ptr
|
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Уж очень не хочется использовать boost в своей программе. К тому же я так понимаю если указатель даже и shared, то компилятор сам ну ни как не определит в какой момент мне нужно удалять его, пока я вручную не задам аналог delete в нужном месте. А это опять же сводит на нет мою идею.
|
|||
|
||||
Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: нет Всего: 12 |
Раз указатели создаются в конструкторе, почему бы не объявить их как переменную класса в виде умного указателя?
Это сообщение отредактировал(а) Dreamer_0x01 - 14.4.2008, 18:16 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
религия не позволяет? ![]() не правильно понимаешь, когда кол-во ссылок на объект станет равным 0, тогда память будет освобождена. |
|||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Нельзя, они динамические. Зависит от количества записей в базе данных. И содержит все эти указатели вектор, который является членом класса. Скорее не религия, а поговорка о пушках и воробьях.
А пример можно ? ![]() Это сообщение отредактировал(а) SABROG - 14.4.2008, 18:22 |
||||
|
|||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
создаешь shared_ptr и инициализируешь его обычным указателем, кол-во ссылок становится равным 1, при любом копировании( в том числе и инициализирующем) кол-во ссылок инкрементируется, при выходе любой копии за границу видимости, кол-во ссылок уменьшается на 1. так вот когда кол-во ссылок становится равным 0, вызывается delete для указателя который обернут в shared_ptr. |
|||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
А как это сработает в таком виде: //псевдо-код
Когда поинтеры убьются, когда убьется otherClass или вызовется delete для A ? |
||||
|
|||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
||||
|
||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Можно использовать ּSTL-овские контейнеры. Только в них не заносить сами указатели, а записи. Что то типа такого
Тогда уже сам контейнер будет заботится об удалении записей. -------------------- Пролетал мимо. |
|||
|
||||
Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
Если ты создашь вектор auto_ptr'ов, то последующий занесенный auto_ptr будет копироатся из конструктора в список. А при копировании auto_ptr класс источник теряет ссылку. Так что выйдя з апределы конструктора ты ничего не потеряешь ибо вызовется деструктор у класса указатель из которого уже извлечен. Т.е. при копировании из одного auto_ptr в другой ты не получишь 2 ссылки на auto_ptr. В таком случае только последний классс будет иметть реально ссылку которую прибьет в деструкторе. Короче кто последний влез, того и тапки. Добавлено через 59 секунд Fin, ага. И туда можно вогнать auto_ptr |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
что то я не совсем понял твой псевдокод |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
не, shared_ptr - это уже указатель (по крайней мере, по смыслу), так что достаточно list<shared_ptr> Это сообщение отредактировал(а) maxim1000 - 14.4.2008, 20:20 -------------------- qqq |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
||||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Т.е. если вместо указателей запхнуть в контейнер auto_ptr'ы, то при удалении контейнера для каждого из объекта auto_ptr'a вызовется деструктор и освобождение памяти ? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |