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)
Определено в заголовочном файле <memory>
template < class Deleter, class T >
Deleter * get_deleter ( const std:: shared_ptr < T > & p ) noexcept ;
(начиная с C++11)

Доступ к удалителю p . Если умный указатель p владеет удалителем типа cv-unqualified Deleter (например, если он был создан с помощью одного из конструкторов, принимающих удалитель в качестве параметра), то возвращает указатель на удалитель. В противном случае возвращает нулевой указатель.

Содержание

Параметры

p - общий указатель, к чьему удалителю требуется доступ

Возвращаемое значение

Указатель на владеемый удалитель или nullptr . Возвращаемый указатель действителен как минимум до тех пор, пока существует хотя бы один shared_ptr экземпляр, который им владеет.

Примечания

Возвращенный указатель может пережить последний shared_ptr если, например, std::weak_ptr остаются и реализация не уничтожает удалитель до тех пор, пока весь блок управления не будет разрушен.

Пример

Демонстрирует, что std::shared_ptr deleter не зависит от типа 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

Вывод:

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

Смотрите также

std::shared_ptr конструкторы
(публичная функция-член)
возвращает удалитель, используемый для уничтожения управляемого объекта
(публичная функция-член std::unique_ptr<T,Deleter> )