О smart pointers для чайника
От: Аноним  
Дата: 26.06.11 11:16
Оценка:
Привет
Долгое время писал на C и Objective C. Теперь возникла задача разобраться с проектом на С++, в котором используются эти самые смарт поинтеры.
Не могли бы вы, без умных слов, на простом примере в сравнении с Objective C объяснить как, зачем и когда они применяются?

В Objective-C работа происходит подсчетом количества поля refcnt объекта, при обнулении которого объект освобождается немедленно. Объект можно release "лениво" — тогда он освободится при следующем выполнении [autoreleasePool drain]. Правила элементарные: Кто вызвал retain — тот должен сделать release. Если собираетесь использовать полученный объект, делайте retain. Методы содержащие слова alloc/copy/create возвращают объект, который получатель должен освободить.

Как это происходит в С++? Пока что использую обычные "new в конструкторе, delete в деструкторе".
Нашел большую статью на rsdn по умным указателям, но один их шаблонный вид испугал , к тому же их десятки видов. Какой обычно используется в реальных проектах?

Спасибо
Re: О smart pointers для чайника
От: jazzer Россия Skype: enerjazzer
Дата: 26.06.11 14:13
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Привет

А>Долгое время писал на C и Objective C. Теперь возникла задача разобраться с проектом на С++, в котором используются эти самые смарт поинтеры.
А>Не могли бы вы, без умных слов, на простом примере в сравнении с Objective C объяснить как, зачем и когда они применяются?

А>В Objective-C работа происходит подсчетом количества поля refcnt объекта, при обнулении которого объект освобождается немедленно. Объект можно release "лениво" — тогда он освободится при следующем выполнении [autoreleasePool drain]. Правила элементарные: Кто вызвал retain — тот должен сделать release. Если собираетесь использовать полученный объект, делайте retain. Методы содержащие слова alloc/copy/create возвращают объект, который получатель должен освободить.


А>Как это происходит в С++? Пока что использую обычные "new в конструкторе, delete в деструкторе".

смарт-поинтеров тысячи.
конкретно boost::shared_ptr занимается подсчетом ссылок. Увеличесние счетчика происходит в конструкторе, т.е. при создании и копировании, уменьшение — в деструкторе.
Ленивость удаления, если она нужна, можно реализовать через дополнительный список из boost::shared_ptr<void>, по которому можно периодически проходить и убивать те, у которых счетчик равен 1 (т.е. больше никто из программы на этот объект не ссылается). Либо сделать соответствующий deleter, который вместо удаления будет добавлять себя в этот список — тогда можно будет просто грохать весь список целиком.
Техника описана здесь (как и другие техники):
http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/sp_techniques.html#delayed

А>Нашел большую статью на rsdn по умным указателям, но один их шаблонный вид испугал

Ye а как ты без шаблонов добьешся типобезопасности?

А>к тому же их десятки видов. Какой обычно используется в реальных проектах?

Зависит от задачи. Если объект уже поддерживает счетчик внутри себя (COM-объекты, например, или те же retain-release), то достаточно intrusive_ptr.
Если считать ссылки не надо, потому что у объекта может быть только один хозяин — unique_ptr(лучше)/auto_ptr(хуже).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: О smart pointers для чайника
От: GreyMan  
Дата: 26.06.11 15:19
Оценка: 1 (1)
Слабые указатели еще не вспомнили, которые позволяют "наблюдать" за объектом.
Re[3]: О smart pointers для чайника
От: jazzer Россия Skype: enerjazzer
Дата: 26.06.11 15:26
Оценка: 7 (2)
Здравствуйте, GreyMan, Вы писали:

GM>Слабые указатели еще не вспомнили, которые позволяют "наблюдать" за объектом.


ну да, они в паре с shared_ptr идут и, помимо наблюдения, позволяют разруливать циклы зависимостей.

PS (Для интересующихся) Еще один инструмент разрушения циклов обсуждается в бустовской рассылке под именем block_ptr.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: О smart pointers для чайника
От: FlamingWind Россия  
Дата: 28.06.11 10:08
Оценка:
А>Какой обычно используется в реальных проектах?

С большой осторожностью, но могу сказать, что "дефолтным" является shared_ptr. В большинстве случаев shared_ptr покрывает требования задачи, в которой необходим умный указатель. Да, зачастую покрывает с избыточностью. Но преждевременная оптимизация вообще сильно вредна, тем более если проект "живой" и активно развивается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.