boost::intrusive_ptr
требует intrusive_ptr_add_ref
и intrusive_ptr_release
быть определенным. Почему базовый класс не обеспечивается, который сделает это? Здесь существует пример: в http://lists.boost.org/Archives/boost/2004/06/66957.php, но плакате говорится, что "Я не обязательно думаю, что это - хорошая идея". Почему нет?
Обновление: Я не думаю то, что этот класс мог неправильно использоваться со Множественным наследованием, причина достаточно. Любой класс, который происходит из нескольких базовых классов с их собственным подсчетом ссылок, имел бы ту же проблему. Реализованы ли эти refcounts через базовый класс, или не не имеет никакого значения.
Я не думаю, что существует любая проблема с многопоточностью; boost::shared_ptr
предлагает атомарный подсчет ссылок, и этот класс мог также.
Это сделано для того, чтобы вы могли использовать intrusive_ptr с классами, которые уже реализуют add и release.
Проблема будет связана с множественным наследованием. Если вы наследуете от двух объектов, реализующих эту базу, то у вас будет два счетчика для одного объекта... и это может привести к хаосу.
Таким образом, вам нужно сделать методы ptr_add
и ptr_release
виртуальными, чтобы производный класс мог реализовать переопределение для правильной синхронизации нескольких счетчиков одновременно... Некоторый штраф за производительность здесь, особенно потому, что в большинстве случаев это будет совершенно ненужным (не будет никакого переопределения), потому что это полезно только для множественного наследования, в конце концов.
И, конечно, в многопоточной среде вы можете иметь (на короткие промежутки времени) десинхронизированные счетчики (первый был увеличен, но поток был прерван до того, как увеличился второй) Я пока не могу вспомнить, какие проблемы это может вызвать, но это не совсем разумная ситуация.
Вы также добавляете беспорядок в класс, некоторые клиенты могут не нуждаться в подсчете ссылок в конце концов (если они создают объект на стеке).
Я думаю, это не очень хорошая идея ;)