|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
weak_ptr::~weak_ptr | ||||
| Modifiers | ||||
| Observers | ||||
(C++26) | ||||
(C++26) | ||||
| Non-member functions | ||||
| Helper classes | ||||
(C++20) | ||||
| Deduction guides(C++17) |
~weak_ptr(); | (since C++11) | |
Destroys theweak_ptr object. Results in no effect to the managed object.
The program shows the effect of "non-breaking" the cycle ofstd::shared_ptrs.
#include <iostream>#include <memory>#include <variant> class Node{char id;std::variant<std::weak_ptr<Node>,std::shared_ptr<Node>> ptr;public: Node(char id): id{id}{} ~Node(){std::cout<<" '"<< id<<"' reclaimed\n";}/*...*/void assign(std::weak_ptr<Node> p){ ptr= p;}void assign(std::shared_ptr<Node> p){ ptr= p;}}; enumclass shared{ all, some}; void test_cyclic_graph(const shared x){auto A=std::make_shared<Node>('A');auto B=std::make_shared<Node>('B');auto C=std::make_shared<Node>('C'); A->assign(B); B->assign(C); if(shared::all== x){ C->assign(A);std::cout<<"All links are shared pointers";}else{ C->assign(std::weak_ptr<Node>(A));std::cout<<"One link is a weak_ptr";}/*...*/std::cout<<"\nLeaving...\n";} int main(){ test_cyclic_graph(shared::some); test_cyclic_graph(shared::all);// produces a memory leak}
Output:
One link is a weak_ptrLeaving... 'A' reclaimed 'B' reclaimed 'C' reclaimedAll links are shared pointersLeaving...
destructs the owned object if no moreshared_ptrs link to it(public member function of std::shared_ptr<T>)[edit] |