Namespaces
Variants

std:: get_deleter

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Definiert in Header <memory>
template < class Deleter, class T >
Deleter * get_deleter ( const std:: shared_ptr < T > & p ) noexcept ;
(seit C++11)

Zugriff auf den p 's Deleter. Wenn der Shared Pointer p einen Deleter vom Typ cv-unqualified Deleter besitzt (z.B. wenn er mit einem der Konstruktoren erstellt wurde, die einen Deleter als Parameter akzeptieren), dann wird ein Zeiger auf den Deleter zurückgegeben. Andernfalls wird ein Nullzeiger zurückgegeben.

Inhaltsverzeichnis

Parameter

p - ein Shared Pointer, auf dessen Deleter zugegriffen werden muss

Rückgabewert

Ein Zeiger auf den besessenen Deleter oder nullptr . Der zurückgegebene Zeiger ist mindestens so lange gültig, wie mindestens eine shared_ptr -Instanz existiert, die ihn besitzt.

Hinweise

Der zurückgegebene Zeiger kann länger existieren als der letzte shared_ptr wenn beispielsweise std::weak_ptr s verbleiben und die Implementierung den Deleter nicht zerstört, bis der gesamte Kontrollblock zerstört wird.

Beispiel

Zeigt, dass der std::shared_ptr Deleter unabhängig vom Typ des shared_ptr ist.

#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 deleter
        auto 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";
    }
    else
        std::cout << "The deleter of shared_ptr<int> is null!\n";
} // deleter called here

Ausgabe:

shared_ptr<int> owns a deleter
...and it equals &foo_deleter
foo_deleter called!

Siehe auch

std::shared_ptr Konstruktoren
(öffentliche Elementfunktion)
gibt den Deleter zurück, der für die Zerstörung des verwalteten Objekts verwendet wird
(öffentliche Elementfunktion von std::unique_ptr<T,Deleter> )