Повысить навязчивый указатель
Я немного запутался насчет навязчивого указателя буста. Определение гласит:
"Каждый новый
intrusive_ptr
Экземпляр увеличивает счетчик ссылок с помощью неквалифицированного вызова функцииintrusive_ptr_add_ref
, передав ему указатель в качестве аргумента. Точно так же, когдаintrusive_ptr
разрушается, это вызываетintrusive_ptr_release
; эта функция отвечает за уничтожение объекта, когда его счетчик ссылок падает до нуля. Ожидается, что пользователь предоставит подходящие определения этих двух функций. "
Означает ли это, что я должен реализовать эти методы или я могу это сделать? Дело в том, что мы используем его, потому что функция требует навязчивого указателя. Мы использовали разделяемый указатель в других местах, поэтому просто волновались, управляется ли указатель, и он будет удален, когда на него больше не будет ссылок.
1 ответ
Вы должны предоставить эти функции. Вот как 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), и указатель просто вторгается в этот refcount, используя его для своих целей.