std::shared_ptr (3) - Linux Manuals
std::shared_ptr: std::shared_ptr
NAME
std::shared_ptr - std::shared_ptr
Synopsis
Defined in header <memory>
template< class T > class shared_ptr; (since C++11)
std::shared_ptr is a smart pointer that retains shared ownership of an object through a pointer. Several shared_ptr objects may own the same object. The object is destroyed and its memory deallocated when either of the following happens:
* the last remaining shared_ptr owning the object is destroyed;
* the last remaining shared_ptr owning the object is assigned another pointer via operator= or reset().
The object is destroyed using delete-expression or a custom deleter that is supplied to shared_ptr during construction.
A shared_ptr can share ownership of an object while storing a pointer to another object. This feature can be used to point to member objects while owning the object they belong to. The stored pointer is the one accessed by get(), the dereference and the comparison operators. The managed pointer is the one passed to the deleter when use count reaches zero.
A shared_ptr may also own no objects, in which case it is called empty (an empty shared_ptr may have a non-null stored pointer if the aliasing constructor was used to create it).
All specializations of shared_ptr meet the requirements of CopyConstructible, CopyAssignable, and LessThanComparable and are contextually_convertible to bool.
All member functions (including copy constructor and copy assignment) can be called by multiple threads on different instances of shared_ptr without additional synchronization even if these instances are copies and share ownership of the same object. If multiple threads of execution access the same shared_ptr without synchronization and any of those accesses uses a non-const member function of shared_ptr then a data race will occur; the shared_ptr_overloads_of_atomic_functions can be used to prevent the data race.
Member types
Member type Definition
element_type T (until C++17)
weak_type (since C++17) std::weak_ptr<T>
Member functions
constructor (public member function)
destructor (public member function)
operator= (public member function)
Modifiers
reset (public member function)
swap (public member function)
Observers
get (public member function)
operator* (public member function)
operator->
operator[] provides indexed access to the stored array
(C++17)
use_count (public member function)
unique checks whether the managed object is managed only by the current shared_ptr instance
(until C++20)
operator_bool (public member function)
owner_before (public member function)
Non-member functions
make_shared
make_shared_default_init creates a shared pointer that manages a new object
(C++20)
allocate_shared
allocate_shared_default_init creates a shared pointer that manages a new object allocated using an allocator
(C++20)
static_pointer_cast
dynamic_pointer_cast
const_pointer_cast
reinterpret_pointer_cast applies static_cast, dynamic_cast, const_cast, or reinterpret_cast to the stored pointer
(C++17)
get_deleter (function template)
operator==
operator!= compares with another shared_ptr or with nullptr
operator< (function template)
operator<=
operator>
operator>=
operator<< (function template)
std::swap(std::shared_ptr) specializes the std::swap algorithm
(C++11)
std::atomic_is_lock_free(std::shared_ptr)
std::atomic_load(std::shared_ptr)
std::atomic_load_explicit(std::shared_ptr)
std::atomic_store(std::shared_ptr)
std::atomic_store_explicit(std::shared_ptr)
std::atomic_exchange(std::shared_ptr) specializes atomic operations for std::shared_ptr
std::atomic_exchange_explicit(std::shared_ptr) (function template)
std::atomic_compare_exchange_weak(std::shared_ptr)
std::atomic_compare_exchange_strong(std::shared_ptr)
std::atomic_compare_exchange_weak_explicit(std::shared_ptr)
std::atomic_compare_exchange_strong_explicit(std::shared_ptr)
(deprecated in C++20)
Helper classes
std::atomic<std::shared_ptr> atomic shared pointer
(C++20)
std::hash<std::shared_ptr> hash support for std::shared_ptr
(C++11)
Deduction_guides(since C++17)
Notes
The ownership of an object can only be shared with another shared_ptr by copy constructing or copy assigning its value to another shared_ptr. Constructing a new shared_ptr using the raw underlying pointer owned by another shared_ptr leads to undefined behavior.
std::shared_ptr may be used with an incomplete_type T. However, the constructor from a raw pointer (template<class Y> shared_ptr(Y*)) and the template<class Y> void reset(Y*) member function may only be called with a pointer to a complete type (note that std::unique_ptr may be constructed from a raw pointer to an incomplete type).
The T in std::shared_ptr<T> may be a function type: in this case it manages a pointer to function, rather than an object pointer. This is sometimes used to keep a dynamic library or a plugin loaded as long as any of its functions are referenced:
Implementation notes
In a typical implementation, std::shared_ptr holds only two pointers:
* the stored pointer (one returned by get());
* a pointer to control block.
The control block is a dynamically-allocated object that holds:
* either a pointer to the managed object or the managed object itself;
* the deleter (type-erased);
* the allocator (type-erased);
* the number of shared_ptrs that own the managed object;
* the number of weak_ptrs that refer to the managed object.
When shared_ptr is created by calling std::make_shared or std::allocate_shared, the memory for both the control block and the managed object is created with a single allocation. The managed object is constructed in-place in a data member of the control block. When shared_ptr is created via one of the shared_ptr constructors, the managed object and the control block must be allocated separately. In this case, the control block stores a pointer to the managed object.
The pointer held by the shared_ptr directly is the one returned by get(), while the pointer/object held by the control block is the one that will be deleted when the number of shared owners reaches zero. These pointers are not necessarily equal.
The destructor of shared_ptr decrements the number of shared owners of the control block. If that counter reaches zero, the control block calls the destructor of the managed object. The control block does not deallocate itself until the std::weak_ptr counter reaches zero as well.
In existing implementations, the number of weak pointers is incremented ([1], [2]) if there is a shared pointer to the same control block.
To satisfy thread safety requirements, the reference counters are typically incremented using an equivalent of std::atomic::fetch_add with std::memory_order_relaxed (decrementing requires stronger ordering to safely destroy the control block).
Example
// Run this code
Possible output: