|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
(C++26) | ||||
(C++26) | ||||
| Non-member functions | ||||
| Helper classes | ||||
(C++20) | ||||
| Deduction guides(C++17) |
Defined in header <memory> | ||
template<class T>class weak_ptr; | (since C++11) | |
std::weak_ptr is a smart pointer that holds a non-owning ("weak") reference to an object that is managed bystd::shared_ptr. It must be converted tostd::shared_ptr in order to access the referenced object.
std::weak_ptr models temporary ownership: when an object needs to be accessed only if it exists, and it may be deleted at any time by someone else,std::weak_ptr is used to track the object, and it is converted tostd::shared_ptr to acquire temporary ownership. If the originalstd::shared_ptr is destroyed at this time, the object's lifetime is extended until the temporarystd::shared_ptr is destroyed as well.
Another use forstd::weak_ptr is to break reference cycles formed by objects managed bystd::shared_ptr. If such cycle is orphaned (i.e., there are no outside shared pointers into the cycle), theshared_ptr reference counts cannot reach zero and the memory is leaked. To prevent this, one of the pointers in the cyclecan be made weak.
Contents |
| Member type | Definition | ||||
element_type |
|
creates a newweak_ptr(public member function)[edit] | |
destroys aweak_ptr(public member function)[edit] | |
assigns theweak_ptr(public member function)[edit] | |
Modifiers | |
| releases the ownership of the managed object (public member function)[edit] | |
| swaps the managed objects (public member function)[edit] | |
Observers | |
returns the number ofshared_ptr objects that manage the object(public member function)[edit] | |
| checks whether the referenced object was already deleted (public member function)[edit] | |
creates ashared_ptr that manages the referenced object(public member function)[edit] | |
| provides owner-based ordering of weak pointers (public member function)[edit] | |
(C++26) | provides owner-based hashing of weak pointers (public member function)[edit] |
(C++26) | provides owner-based equal comparison of weak pointers (public member function)[edit] |
(C++11) | specializes thestd::swap algorithm (function template)[edit] |
(C++20) | atomic weak pointer (class template specialization)[edit] |
Likestd::shared_ptr, a typical implementation ofweak_ptr stores two pointers:
shared_ptr it was constructed from.A separate stored pointer is necessary to ensure that converting ashared_ptr toweak_ptr and then back works correctly, even for aliasedshared_ptrs. It is not possible to access the stored pointer in aweak_ptr without locking it into ashared_ptr.
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_smart_ptr_owner_equality | 202306L | (C++26) | Enabling the use ofstd::weak_ptr as keys inunordered associative containers |
Demonstrates how lock is used to ensure validity of the pointer.
#include <iostream>#include <memory> std::weak_ptr<int> gw; void observe(){std::cout<<"gw.use_count() == "<< gw.use_count()<<"; ";// we have to make a copy of shared pointer before usage:if(std::shared_ptr<int> spt= gw.lock())std::cout<<"*spt == "<<*spt<<'\n';elsestd::cout<<"gw is expired\n";} int main(){{auto sp=std::make_shared<int>(42); gw= sp; observe();} observe();}
Output:
gw.use_count() == 1; *spt == 42gw.use_count() == 0; gw is expired
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3001 | C++17 | element_type was not updated for array support | updated |
(C++11) | smart pointer with unique object ownership semantics (class template)[edit] |
(C++11) | smart pointer with shared object ownership semantics (class template)[edit] |