Namensräume
Varianten
Aktionen

std::get_deleter

Von cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
 
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 Deleter von p. Wenn der Smart 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.

Inhalt

[bearbeiten] Parameter

p - ein Shared Pointer, dessen Deleter zugegriffen werden soll

[bearbeiten] Rückgabewert

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

[bearbeiten] Hinweise

Der zurückgegebene Zeiger kann die letzte shared_ptr-Instanz überdauern, wenn zum Beispiel std::weak_ptr-Instanzen verbleiben und die Implementierung den Deleter erst zerstört, wenn der gesamte Kontrollblock zerstört wird.

[bearbeiten] Beispiel

Demonstriert, dass der Deleter von std::shared_ptr 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!

[bearbeiten] Siehe auch

std::shared_ptr-Konstruktoren
(öffentliche Memberfunktion)
Gibt den Deleter zurück, der zur Zerstörung des verwalteten Objekts verwendet wird
(public member function of std::unique_ptr<T,Deleter>) [bearbeiten]