Шаблон класса<intrusive_ptr>хранит указатель на объект со встроенным счетчиком ссылок. Каждый новый<intrusive_ptr>экземпляр увеличивает количество ссылок, используя неквалифицированный вызов функции<intrusive_ptr_add_ref>, передавая ей указатель в качестве аргумента. Точно так же, когда<intrusive_ptr>разрушается, он вызывает<intrusive_ptr_release>; эта функция отвечает за разрушение объекта, когда его количество ссылок падает до нуля. Ожидается, что пользователь предоставит соответствующие определения этих двух функций. На компиляторах, поддерживающих аргументно-зависимый поиск,<intrusive_ptr_add_ref>и<intrusive_ptr_release>должны быть определены в пространстве имен, соответствующем их параметру; в противном случае определения должны идти в пространстве имен<boost>. Библиотека предоставляет шаблон базового класса помощника<intrusive_ref_counter>, который может помочь добавить поддержку<intrusive_ptr>к типам пользователей.
Шаблон класса параметризован на<T>, тип объекта, на который указывается.<intrusive_ptr<T>>может быть неявно преобразован в<intrusive_ptr<U>>, когда<T*>может быть неявно преобразован в<U*>.
Основные причины использования<intrusive_ptr>:
Некоторые существующие фреймворки или ОС предоставляют объектам встроенные ссылки;
Отпечаток памятиintrusive_ptrтакой же, как и соответствующий необработанный указатель;
intrusive_ptr<T>может быть построен из произвольного исходного указателя типаT *.
Как правило, если не очевидно, что<intrusive_ptr>лучше соответствует вашим потребностям, чем<shared_ptr>, сначала попробуйте<shared_ptr>-ориентированный дизайн.
Примечания:Возвращенный указатель имеет повышенное количество ссылок. Это позволяет конвертировать<intrusive_ptr>обратно в необработанный указатель, без накладных расходов на производительность при приобретении и сбросе дополнительной ссылки. Его можно рассматривать как дополнение нессылочного конструктора.
Осторожность:Использование<detach>исключает безопасность автоматического подсчета ссылок, предоставляемого<intrusive_ptr>. Он должен использоваться только там, где это строго необходимо (например, при взаимодействии с существующим API) и когда последствия полностью понятны.
operator unspecified-bool-type () const; // never throws
Возврат:неопределенное значение, которое при использовании в булевом контексте эквивалентно<get() != 0>.
Бросает:ничего.
Примечания:Этот оператор преобразования позволяет использовать<intrusive_ptr>объекты в булевом контексте, например<if (p && p->valid()) {}>. Фактический целевой тип обычно указывает на функцию члена, избегая многих неявных ошибок преобразования.
template<class E, class T, class Y>
std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, intrusive_ptr<Y> const & p);
Эффекты:<os << p.get();>.
Возвращение:<os>.
$Date$
<маленький>Копирайт &копия; 2003-2005, 2013 Питер Димов. Distributed under the Boost Software License, Version
1.0. См. сопроводительный файл LICENSE_1_0.txt or
copy at http://www.boost.org/LICENSE_1_0.txt.[ORIG_END] -->
Статья intrusive_ptr раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.