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

std::get_deleter

Материал из cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, 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
 
 
Определено в заголовочном файле <memory>
template< class Deleter, class T >
Deleter* get_deleter( const std::shared_ptr<T>& p ) noexcept;
(начиная с C++11)

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

Содержание

[править] Параметры

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

[править] Возвращаемое значение

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

[править] Примечание

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

[править] Пример

демонстрирует, что средство удаления класса std::shared_ptr не зависит от типа 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) [править]