|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
(C++17) | ||||
(until C++20*) | ||||
(C++26) | ||||
(C++26) | ||||
| Non-member functions | ||||
get_deleter | ||||
(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) |
Defined in header <memory> | ||
template<class Deleter,class T> Deleter* get_deleter(conststd::shared_ptr<T>& p)noexcept; | (since C++11) | |
Access to thep's deleter. If the shared pointerp owns a deleter of type cv-unqualifiedDeleter (e.g. if it was created with one of the constructors that take a deleter as a parameter), then returns a pointer to the deleter. Otherwise, returns a null pointer.
Contents |
| p | - | a shared pointer whose deleter needs to be accessed |
A pointer to the owned deleter ornullptr. The returned pointer is valid at least as long as there remains at least oneshared_ptr instance that owns it.
The returned pointer may outlive the lastshared_ptr if, for example,std::weak_ptrs remain and the implementation doesn't destroy the deleter until the entire control block is destroyed.
Demonstrates thatstd::shared_ptr deleter is independent of theshared_ptr's type.
#include <iostream>#include <memory> struct Foo{int i;};void foo_deleter(Foo* p){std::cout<<"foo_deleter called!\n"; delete p;} int main(){std::shared_ptr<int> aptr; {// create a shared_ptr that owns a Foo and a deleterauto foo_p= new Foo;std::shared_ptr<Foo> r(foo_p, foo_deleter); aptr=std::shared_ptr<int>(r,&r->i);// aliasing ctor// aptr is now pointing to an int, but managing the whole Foo}// r gets destroyed (deleter not called) // obtain pointer to the deleter:if(auto del_p= std::get_deleter<void(*)(Foo*)>(aptr)){std::cout<<"shared_ptr<int> owns a deleter\n";if(*del_p== foo_deleter)std::cout<<"...and it equals &foo_deleter\n";}elsestd::cout<<"The deleter of shared_ptr<int> is null!\n";}// deleter called here
Output:
shared_ptr<int> owns a deleter...and it equals &foo_deleterfoo_deleter called!
| std::shared_ptr constructors (public member function) | |
| returns the deleter that is used for destruction of the managed object (public member function of std::unique_ptr<T,Deleter>)[edit] |