Повысить навязчивый указатель

Я немного запутался насчет навязчивого указателя буста. Определение гласит:

"Каждый новый 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, используя его для своих целей.

Другие вопросы по тегам