Здравствуйте, Аноним, Вы писали:
А>Привет А>Долгое время писал на 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(хуже).
Слабые указатели еще не вспомнили, которые позволяют "наблюдать" за объектом.
О 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 по умным указателям, но один их шаблонный вид испугал , к тому же их десятки видов. Какой обычно используется в реальных проектах?
С большой осторожностью, но могу сказать, что "дефолтным" является shared_ptr. В большинстве случаев shared_ptr покрывает требования задачи, в которой необходим умный указатель. Да, зачастую покрывает с избыточностью. Но преждевременная оптимизация вообще сильно вредна, тем более если проект "живой" и активно развивается.