|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
shared_ptr::~shared_ptr | ||||
| Modifiers | ||||
| Observers | ||||
(C++17) | ||||
(until C++20*) | ||||
(C++26) | ||||
(C++26) | ||||
| Non-member functions | ||||
(until C++20)(until C++20)(until C++20)(until C++20)(until C++20)(C++20) | ||||
functions(until C++26*) | ||||
| Helper classes | ||||
(C++20) | ||||
| Deduction guides(C++17) |
~shared_ptr(); | ||
If*this owns an object and it is the lastshared_ptr owning it, the object is destroyed through the owned deleter.
After the destruction, the smart pointers that shared ownership with*this, if any, will report ause_count() that is one less than its previous value.
Unlikestd::unique_ptr, the deleter ofstd::shared_ptr is invoked even if the managed pointer is null.
#include <iostream>#include <memory> struct S{ S(){std::cout<<"S::S()\n";} ~S(){std::cout<<"S::~S()\n";}struct Deleter{void operator()(S* s)const{std::cout<<"S::Deleter()\n"; delete s;}};}; int main(){auto sp=std::shared_ptr<S>{new S, S::Deleter{}}; auto use_count=[&sp](char c){std::cout<< c<<") use_count(): "<< sp.use_count()<<'\n';}; use_count('A');{auto sp2= sp; use_count('B');{auto sp3= sp; use_count('C');} use_count('D');} use_count('E'); // sp.reset();// use_count('F'); // would print "F) use_count(): 0"}
Output:
S::S()A) use_count(): 1B) use_count(): 2C) use_count(): 3D) use_count(): 2E) use_count(): 1S::Deleter()S::~S()
destroys aweak_ptr(public member function of std::weak_ptr<T>)[edit] |