Пространства имён
Варианты
Действия

std::get_deleter

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
 
<tbody> </tbody>
Определено в заголовочном файле <memory>
template< class Deleter, class T > Deleter* get_deleter( const std::shared_ptr<T>& p ) noexcept;
(начиная с C++11)

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

Параметры

p общий указатель, к средству удаления которого необходимо получить доступ

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

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

Примечание

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

Пример

демонстрирует, что средство удаления класса std::shared_ptr не зависит от типа std::shared_ptr

#include <iostream>
#include <memory>

struct Foo { int i; };
void foo_deleter(Foo * p)
{
    std::cout << "foo_deleter вызвана!\n";
    delete p;
}

int main()
{
    std::shared_ptr<int> aptr;

    {
        // создёт shared_ptr, которому принадлежат Foo и средство удаления
        auto foo_p = new Foo;
        std::shared_ptr<Foo> r(foo_p, foo_deleter);
        aptr = std::shared_ptr<int>(r, &r->i); // псевдоним конструктора
        // aptr теперь указывает на int, но управляет всем Foo
    } // r уничтожается (средство удаления не вызывается)

    // получает указатель на средство удаления:
    if(auto del_p = std::get_deleter<void(*)(Foo*)>(aptr))
    {
        std::cout << "shared_ptr<int> владеет средством удаления\n";
        if(*del_p == foo_deleter)
            std::cout << "...и оно равно &foo_deleter\n";
    } else
        std::cout << "Средство удаления shared_ptr<int> равно null!\n";
} // средство удаления вызывается здесь

Вывод:

shared_ptr<int> владеет средством удаления
...и оно равно &foo_deleter
foo_deleter вызвана!

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

конструкторы std::shared_ptr
(public функция-элемент)
возвращает средство удаления, которое используется для уничтожения управляемого объекта
(public функция-элемент std::unique_ptr) [править]