// In header: <boost/interprocess/smart_ptr/shared_ptr.hpp>
template<typename T,typename VoidAllocator,typename Deleter>classshared_ptr{public:// typestypedefTelement_type;typedefTvalue_type;typedefboost::intrusive::pointer_traits<typenameVoidAllocator::pointer>::templaterebind_pointer<T>::typepointer;typedefunspecifiedreference;typedefunspecifiedconst_reference;typedefboost::intrusive::pointer_traits<typenameVoidAllocator::pointer>::templaterebind_pointer<constDeleter>::typeconst_deleter_pointer;typedefboost::intrusive::pointer_traits<typenameVoidAllocator::pointer>::templaterebind_pointer<constVoidAllocator>::typeconst_allocator_pointer;// construct/copy/destructshared_ptr();explicitshared_ptr(constpointer&,constVoidAllocator&=VoidAllocator(),constDeleter&=Deleter());shared_ptr(constshared_ptr&);shared_ptr(constshared_ptr&,constpointer&);template<typename Y>shared_ptr(shared_ptr<Y,VoidAllocator,Deleter>const&);template<typename Y>explicitshared_ptr(weak_ptr<Y,VoidAllocator,Deleter>const&);explicitshared_ptr(shared_ptr&&);template<typename Y>shared_ptr&operator=(shared_ptr<Y,VoidAllocator,Deleter>const&);shared_ptr&operator=(BOOST_COPY_ASSIGN_REF(shared_ptr));shared_ptr&operator=(shared_ptr&&);// public member functionsvoidreset();template<typename Pointer>voidreset(constPointer&,constVoidAllocator&=VoidAllocator(),constDeleter&=Deleter());template<typename Y>voidreset(shared_ptr<Y,VoidAllocator,Deleter>const&,constpointer&);referenceoperator*()const;pointeroperator->()const;pointerget()const;booloperator!()const;boolunique()const;longuse_count()const;voidswap(shared_ptr<T,VoidAllocator,Deleter>&);};
Description
shared_ptrсохраняет указатель на динамически выделенный объект. Указанный объект гарантированно удаляется, когда последнийshared_ptr, указывающий на него, уничтожается или сбрасывается.
Shared_ptrпараметризуется на T (тип объекта, на который указывается), VoidAllocator (распределитель пустоты, который будет использоваться для распределения вспомогательных данных) и Deleter (удаляющее устройство, оператор() которого будет использоваться для удаления объекта).
Внутренний указатель будет иметь тот же тип указателя, что и имя типа VoidAllocator::pointer type (то есть, если имя типа VoidAllocator::pointer is offset_ptr, внутренний указатель будет offset_ptr).
Поскольку реализация использует подсчет ссылок, циклыshared_ptrИск не будет возвращен. Например, если main() удерживаетshared_ptrна A, который прямо или косвенно удерживаетshared_ptrобратно на A, количество использования A будет 2. Уничтожение оригинальногоshared_ptrоставит A с количеством использования 1. Используйтеweak_ptrдля «разрыва циклов».
Конструируетshared_ptr, которому принадлежит указатель p. Вспомогательные данные будут выделены с копией a, а объект будет удален с копией d. Требования: Делитер и конструктор А не должны бросать.
Копия конструируетshared_ptr. Если r пуст, то образуется пустоеshared_ptr. В противном случае строитсяshared_ptr, который разделяет право собственности с r. Никогда не бросай.
Конструируетshared_ptr, который разделяет право собственности с другими и магазинами p. Postconditions: get() == p&& use_count() == r.use_count(). Броски: ничего.
Возвращает указатель, указывающий на принадлежащий объект
указательполучитьконст;
Возвращает указатель, указывающий на принадлежащий объект
boolоператор!const;
Не оператор. Возвращается верно, если это->get()! 0, ложно иначе
booluniqueconst;
Возврат использования_count() == 1. unique() может быть быстрее, чем use_count()
длинныйuse_countконст;
Возвращает количествоShared_ptrобъектов, *это включено, что владение акциями с *это, или неопределенное неотрицательное значение, когда *это пуст. use_count() не обязательно эффективен. Используйте только для отладки и тестирования, а не для производственного кода.
Статья Class template shared_ptr раздела The Boost C++ Libraries BoostBook Documentation Subset Indexes and Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.