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)
Definido en el encabezado <memory>
template < class Deleter, class T >
Deleter * get_deleter ( const std:: shared_ptr < T > & p ) noexcept ;
(desde C++11)

Acceso al p 's deleter. Si el shared pointer p posee un deleter de tipo cv-unqualified Deleter (por ejemplo, si fue creado con uno de los constructores que toman un deleter como parámetro), entonces devuelve un puntero al deleter. De lo contrario, devuelve un puntero nulo.

Contenidos

Parámetros

p - un puntero compartido cuyo deleter necesita ser accedido

Valor de retorno

Un puntero al deleter poseído o nullptr . El puntero devuelto es válido al menos mientras quede al menos una instancia de shared_ptr que lo posea.

Notas

El puntero devuelto puede sobrevivir al último shared_ptr si, por ejemplo, std::weak_ptr s permanecen y la implementación no destruye el deleter hasta que todo el bloque de control sea destruido.

Ejemplo

Demuestra que el std::shared_ptr deleter es independiente del tipo del shared_ptr .

#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

Salida:

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

Véase también

std::shared_ptr constructores
(función miembro pública)
devuelve el deleter que se utiliza para la destrucción del objeto gestionado
(función miembro pública de std::unique_ptr<T,Deleter> )