std::weak_ptr
 <memory> 
 std::weak_ptr is a smart pointer that holds a non-owning ("weak") reference to an object that is managed by std::shared_ptr . It must be converted to std::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 to std::shared_ptr  to acquire temporary ownership. If the original std::shared_ptr  is destroyed at this time, the object's lifetime is extended until the temporary std::shared_ptr  is destroyed as well.
Another use for std::weak_ptr is to break reference cycles formed by objects managed by std::shared_ptr . If such cycle is orphaned (i.e., there are no outside shared pointers into the cycle), the shared_ptr reference counts cannot reach zero and the memory is leaked. To prevent this, one of the pointers in the cycle can be made weak.
Contents
[edit] Member types
element_type
 
T
(until C++17)[edit] Member functions
Modifiers
Observers
[edit] Non-member functions
[edit] Helper classes
[edit] Deduction guides (since C++17)
[edit] Notes
Like std::shared_ptr , a typical implementation of weak_ptr stores two pointers:
- a pointer to the control block; and
-  the stored pointer of the shared_ptrit was constructed from.
A separate stored pointer is necessary to ensure that converting a shared_ptr to weak_ptr and then back works correctly, even for aliased shared_ptrs. It is not possible to access the stored pointer in a weak_ptr without locking it into a shared_ptr.
| Feature-test macro | Value | Std | Feature | 
|---|---|---|---|
| __cpp_lib_smart_ptr_owner_equality | 202306L | (C++26) | Enabling the use of std::weak_ptras keys in unordered associative containers | 
[edit] Example
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'; else std::cout << "gw is expired\n"; } int main() { { auto sp = std::make_shared <int>(42); gw = sp; observe(); } observe(); }
Output:
gw.use_count() == 1; *spt == 42 gw.use_count() == 0; gw is expired
[edit] Defect reports
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_typewas not updated for array support | updated |