![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
||
|
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Хотел бы немного подискутировать на тему умных указателей. А именно. Есть два типа умных указателей, с ручным подсчетом ссылок (addRef/releaseRef), и с автоматическим по типу shared_ptr. Удобство и смысл второго, для меня всецело понятен, и без него жизнь не мила. Суть первого понятна, но, удобством что то тут особо и не попахивает. Вернее я его не вижу.
Но, например если рассматривать конкретную задачу, библиотеку, то возможен такой случай: есть некий главный класс Engine, есть некие другие классы например Session и Message. Библиотека дает возможность создать экземпляр Engine, но не дает возможности на прямую создавать Session и Message. Их можно создать только через экземпляр Engine, и получить указатель на них. Например для того что бы сугубо контролировать число и работу сессий через Engine. Тогда получается следующая иерархия
на ружу (доступны из библиотеки) у нас торчит только абстрактный Session. В самой же библиотеки работа ведется с XSession. Таким образом мы не даем пользователю возможности на прямую создавать экземпляры Session и предоставляем ему не голый указатель а smart pointer. Втиснуть в эту логику shared_ptr не получится, хотя бы из за того что у того кто будет пользоваться библиотекой boost'a не будет, ибо на C# нету его %) Ну или я просто недодумал как это сделать. Теперь ваши примеры, и практика использования ![]() Ахда, самое важное, когда я спросил можно ли я отойду от логики ручного подсчета и заюзаю shared_ptr (ну мол все равно ничего не изменить (это до того как я сообразил что все равно не выйдет заюзать)) я услышал в ответ нечто подобное "shared_ptr не нравиться, использую только когда не возможно intrusive использовать". Я помню что порой встречал ярые споры на тему что shared_ptr страшное зло и надо юзать там что то другое. Вот и решил углубиться и узнать мнения дгурих и перенять опыт, дабы слепо не махать тапками во время спора. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
addRef/releaseRef применяется в реализации различных платформ, для встраивания в них GC. При этом объекты самой платформы обладают встроенным счетчиком ссылок, но предназначен он не для упрощения жизни самих объектов, а того, что платформа реализует.
Основное применение этого подхода - движки различных скриптовых (или byte code ориентированных) языков со встроенной GC. В этом случае объекты с addRef/releaseRef - это native реализация объектов языка, а пользователь этой функциональности - программа на этом самом скриптовом языке. Второй пример - COM (и все, что от него растет). Кстати, addRef/releaseRef никоим образом не мешает сделать поверх него аналог shared_ptr, для использования в самих объектах (или для прямой с ними работы). Яркий пример - COM + Atl CComPtr |
|||
|
||||
cupper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Я не знаю что такое GC, поэтому не понял о чем вы ![]() То что над addRef/release можно сделать умную обертку это само собой понятно, во только это как то нелепо выглядит: "умный указатель для умного указателя". |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это Garbage Collection, по русски будет 'Сборка мусора'. 'Умные поинтеры' - это один из способов реализации этой самой GC
Ну так собственно и делают. Сами addRef/release лиш дают возможность, но не обеспечивают автоматическую сборку мусора/удаление неиспользуемых объектов. А вот обвернутые вокруг них smart pointer'ы обеспечивают.
Нормально это выглядит, я уже упоминал - CComPtr в Atl. Аналоги есть в MFC, VCL (по видимому и в Qt). А в Object Pascal (a-la Delphi) их встроили на уровне языка. На голых addRef/release работают лишь если эти объекты можно пересчитать по пальцам и место их использования можно охватить одним взглядом на экран. Ну и еще настоящие мазохисты ![]() Явное использование addRef/release на уровне объектов (без враперов) более провоцирует на ошибки, чем позволяет реализовать полноценный GC |
||||
|
|||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Более удачным (как, например, тут) будет деление механизмов управления памятью на три группы
-------------------- |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Что-то не видел я такого. Там есть QSharedPointer, аналог boost::shared_ptr. Если где-то и используется addRef/release, то это скрыто глубоко в недрах платформозависимого кода и наружу не выходит.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |