Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Умные указатели (smart pointers), auto_ptr и т.п. 
:(
    Опции темы
SABROG
Дата 14.4.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Есть класс, который генерит древовидную структуру используя обычные указателями. Структура довольно сложная и громоздкая, я боюсь где-то могу забыть прописать удаление указателя в деструкторе класса. Посему назрела мысль использовать "умников-стрелочников". Но насколько я понял пободные смартпоинтеры действуют по принципу - вышли из области видимости - сработал деструктор и сами удалились. Но у меня ситуация такая, в конструкторе создаются указатели, но при выходе из конструктора они должны остаться валидными и удалиться только в деструкторе моего класса. Как в таком случае применить смарт-поинтеры если их участь - подохнуть точно также как локальный объект созданный во временном стеке, теряется смысл ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Daevaorn
Дата 14.4.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Всё зависит от типа умного указателя. Далеко не все общедоступные реализации "умирают" при выходе из области видимости. Например boost::shared_ptr
PM MAIL WWW   Вверх
SABROG
Дата 14.4.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Уж очень не хочется использовать boost в своей программе. К тому же я так понимаю если указатель даже и shared, то компилятор сам ну ни как не определит в какой момент мне нужно удалять его, пока я вручную не задам аналог delete в нужном месте. А это опять же сводит на нет мою идею.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Dreamer_0x01
Дата 14.4.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



Раз указатели создаются в конструкторе, почему бы не объявить их как переменную класса в виде умного указателя?

Это сообщение отредактировал(а) Dreamer_0x01 - 14.4.2008, 18:16


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
vinter
Дата 14.4.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(SABROG @  14.4.2008,  19:11 Найти цитируемый пост)
Уж очень не хочется использовать boost в своей программе.

религия не позволяет? smile
Цитата(SABROG @  14.4.2008,  19:11 Найти цитируемый пост)
 К тому же я так понимаю если указатель даже и shared, то компилятор сам ну ни как не определит в какой момент мне нужно удалять его, пока я вручную не задам аналог delete в нужном месте.

не правильно понимаешь, когда кол-во ссылок на объект станет равным 0, тогда память будет освобождена.


--------------------
Мой блог
PM MAIL WWW   Вверх
SABROG
Дата 14.4.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(Dreamer_0x01 @  14.4.2008,  18:15 Найти цитируемый пост)
Раз указатели создаются в конструкторе, почему бы не объявить их как переменную класса в виде умного указателя?

Нельзя, они динамические. Зависит от количества записей в базе данных. И содержит все эти указатели вектор, который является членом класса.

Цитата(vinter @  14.4.2008,  18:16 Найти цитируемый пост)
религия не позволяет?

Скорее не религия, а поговорка о пушках и воробьях.

Цитата(vinter @  14.4.2008,  18:16 Найти цитируемый пост)
не правильно понимаешь, когда кол-во ссылок на объект станет равным 0, тогда память будет освобождена.


А пример можно ?  smile

Это сообщение отредактировал(а) SABROG - 14.4.2008, 18:22


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
vinter
Дата 14.4.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(SABROG @  14.4.2008,  19:17 Найти цитируемый пост)
А пример можно ?  

создаешь shared_ptr и инициализируешь его обычным указателем, кол-во ссылок становится равным 1, при любом копировании( в том числе и инициализирующем) кол-во ссылок инкрементируется, при выходе любой копии за границу видимости, кол-во ссылок уменьшается на 1. так вот когда кол-во ссылок становится равным 0, вызывается delete для указателя который обернут в shared_ptr.


--------------------
Мой блог
PM MAIL WWW   Вверх
SABROG
Дата 14.4.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(vinter @ 14.4.2008,  18:31)
Цитата(SABROG @  14.4.2008,  19:17 Найти цитируемый пост)
А пример можно ?  

создаешь shared_ptr и инициализируешь его обычным указателем, кол-во ссылок становится равным 1, при любом копировании( в том числе и инициализирующем) кол-во ссылок инкрементируется, при выходе любой копии за границу видимости, кол-во ссылок уменьшается на 1. так вот когда кол-во ссылок становится равным 0, вызывается delete для указателя который обернут в shared_ptr.

А как это сработает в таком виде:

//псевдо-код
Код

class A
{
public:
    list<shared_ptr *> pointers;
    A()
   {
         foreach(...)
         {
            pointers << shared_ptr(new Object);
         }
   }
}
otherClassConstructor()
{
// oA глобальный член otherClassConstructor
oA = new A;
}
metod1ofOtherClass()
{
... = oA.pointers[3];
}


Когда поинтеры убьются, когда убьется otherClass или вызовется delete для A ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Rififi
Дата 14.4.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Цитата(SABROG @  14.4.2008,  18:17 Найти цитируемый пост)
Скорее не религия, а поговорка о пушках и воробьях.

Boost  Smart Pointer является совершенно самостоятельной библиотекой и даже не требует связывания на этапе линковки (вся функциональность содержится в заголовочных файлах)
Это к вопросу о пушках.
PM MAIL   Вверх
Fin
Дата 14.4.2008, 19:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 3
Всего: 10



Можно использовать ּSTL-овские контейнеры. Только в них не заносить сами указатели, а записи. Что то типа такого
Код

   vector<string> obj; 
   //...........
   obj.push_back("mathematics");
   obj.push_back("physics");
   obj.push_back("drafting");
   obj.push_back("chemistry");
   obj.push_back("resistent of stuff");


Тогда уже сам контейнер будет заботится об удалении записей.



--------------------
Пролетал мимо.
PM MAIL   Вверх
Mephisto
Дата 14.4.2008, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: нет
Всего: 34



Цитата(SABROG @  14.4.2008,  18:55 Найти цитируемый пост)
Но у меня ситуация такая, в конструкторе создаются указатели, но при выходе из конструктора они должны остаться валидными и удалиться только в деструкторе моего класса

Если ты создашь вектор auto_ptr'ов, то последующий занесенный auto_ptr будет копироатся из конструктора в список. А при копировании auto_ptr класс источник теряет ссылку. Так что выйдя з апределы конструктора ты ничего не потеряешь ибо вызовется деструктор у класса указатель из которого уже извлечен.
Т.е. при копировании из одного auto_ptr в другой ты не получишь 2 ссылки на auto_ptr. В таком случае только последний классс будет иметть реально ссылку которую прибьет в деструкторе. Короче кто последний влез, того и тапки.

Добавлено через 59 секунд
Fin, ага. И туда можно вогнать auto_ptr
PM   Вверх
vinter
Дата 14.4.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(SABROG @  14.4.2008,  19:40 Найти цитируемый пост)
А как это сработает в таком виде:

что то я не совсем понял твой псевдокод 


--------------------
Мой блог
PM MAIL WWW   Вверх
maxim1000
Дата 14.4.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(SABROG @  14.4.2008,  18:40 Найти цитируемый пост)
list<shared_ptr *> pointers;

не, shared_ptr - это уже указатель (по крайней мере, по смыслу), так что достаточно list<shared_ptr>

Это сообщение отредактировал(а) maxim1000 - 14.4.2008, 20:20


--------------------
qqq
PM WWW   Вверх
Rififi
Дата 14.4.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Цитата(Mephisto @  14.4.2008,  19:36 Найти цитируемый пост)
Если ты создашь вектор auto_ptr'ов, то

... в программе очень скоро начнутся проблемы smile
Подробности почему - читать в книгах зубров (Мейерс/Саттер)

Добавлено через 58 секунд
PS. собственно, ты дальше сам рассказал почему.
PM MAIL   Вверх
SABROG
Дата 14.4.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(Mephisto @  14.4.2008,  19:36 Найти цитируемый пост)
Fin, ага. И туда можно вогнать auto_ptr 


Т.е. если вместо указателей запхнуть в контейнер auto_ptr'ы, то при удалении контейнера для каждого из объекта auto_ptr'a вызовется деструктор и освобождение памяти ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1001 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.