Я немного запутался насчет навязчивого указателя буста. Определение гласит:
«Каждый новый
intrusive_ptr
экземпляр увеличивает количество ссылок на
используя неквалифицированный вызов функцииintrusive_ptr_add_ref
,
передавая ему указатель в качестве аргумента. Точно так же, когда
intrusive_ptr
разрушается, это вызываетintrusive_ptr_release
; этот
функция отвечает за уничтожение объекта при его обращении
количество падает до нуля. Ожидается, что пользователь предоставит
определения этих двух функций. «
Означает ли это, что я должен реализовать эти методы или я могу это сделать? Дело в том, что мы используем его, потому что функция требует навязчивого указателя. Мы использовали разделяемый указатель в других местах, поэтому просто волновались, управляется ли указатель, и будет ли он удален, когда на него больше не будет ссылок.
Вы должен обеспечить эти функции. Вот как boost::intrusive_ptr
работает.
Давайте сравним это с boost::shared_ptr
, shared_ptr
управляет счетчиком ссылок в блоке управления, связанном с получателем. Создание shared_ptr
увеличивает счет. Уничтожение shared_ptr
уменьшает счет. Когда счет возвращается к 0, пуанти уничтожается.
intrusive_ptr
работает точно так же, но не управляет самим счетчиком ссылок. Он просто сигнализирует своему клиенту «теперь счет должен быть увеличен» и «теперь счет должен быть уменьшен». Он делает это, вызывая две упомянутые функции, intrusive_ptr_add_ref
а также intrusive_ptr_release
, Если вы не определите их, вы получите ошибку компиляции.
Думайте об этих функциях как о интерфейсе со счетчиком ссылок. С помощью intrusive_ptr
указывает, что refcount управляется где-то вне указателя (обычно в самом pointee), а указатель просто вторгается на этот счет, используя его в своих целях.
Других решений пока нет …