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

std::default_delete

Материал из cppreference.com
< cpp‎ | memory
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, 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++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
 
std::default_delete
 
Определено в заголовочном файле <memory>
template<class T >struct default_delete;
(1) (начиная с C++11)
template<class T >struct default_delete<T[]>;
(2) (начиная с C++11)

std::default_delete это политика уничтожения по умолчанию, используемая std::unique_ptr когда средство удаления не указано. Специализации default_delete представляют собой пустые классы в типичных реализациях и используются в оптимизации пустого базового класса.

1) Неспециализированный default_delete использует delete для освобождения памяти для одного объекта.
2) Также предоставляется частичная специализация для типов массивов, использующая delete[].

Содержание

[править]Функции-элементы

(конструктор)
создаёт объект default_delete
(public функция-элемент)[править]
operator()
удаляет объект или массив
(public функция-элемент)[править]

std::default_delete::default_delete

constexpr default_delete()noexcept=default;
(1)
(2)
template<class U>
default_delete(const default_delete<U>& d )noexcept;
(начиная с C++11)
(до C++23)
(только элемент основного шаблона default_delete)
template<class U>
constexpr default_delete(const default_delete<U>& d )noexcept;
(начиная с C++23)
(только элемент основного шаблона default_delete)
(3)
template<class U>
default_delete(const default_delete<U[]>& d )noexcept;
(начиная с C++11)
(до C++23)
(элемент только специализации default_delete<T[]>)
template<class U>
constexpr default_delete(const default_delete<U[]>& d )noexcept;
(начиная с C++23)
(элемент только специализации default_delete<T[]>)
1) Создаёт объект std::default_delete.
2) Создаёт объект std::default_delete<T> из другого объекта std::default_delete. Этот конструктор будет участвовать в разрешении перегрузки, только если U* неявно преобразуется в T*.
3) Создаёт объект std::default_delete<T[]> из другого объекта std::default_delete<U[]>. Этот конструктор будет участвовать в разрешении перегрузки, только если U(*)[] неявно преобразуется в T(*)[].

Параметры

d средство удаления для копирования

Примечание

Шаблон конструктора преобразования класса std::default_delete делает возможным неявное преобразование из std::unique_ptr<Derived> в std::unique_ptr<Base>.

std::default_delete::operator()

(1)
void operator()(T* ptr)const;
(начиная с C++11)
(до C++23)
(только элемент основного шаблона default_delete)
constexprvoid operator()(T* ptr)const;
(начиная с C++23)
(только элемент основного шаблона default_delete)
(2)
template<class U>
void operator()(U* ptr)const;
(начиная с C++11)
(до C++23)
(элемент только специализации default_delete<T[]>)
template<class U>
constexprvoid operator()(U* ptr)const;
(начиная с C++23)
(элемент только специализации default_delete<T[]>)
1) Вызывает delete для ptr.
2) Вызывает delete[] для ptr. Эта функция будет участвовать в разрешении перегрузки, только если U(*)[] неявно преобразуется в T(*)[].

В любом случае, если U неполный тип, программа некорректна.

Параметры

ptr объект или массив для удаления

Исключения

Не гарантирует никаких исключений.

[править]Вызов Неполных Типов

В момент вызова operator() в коде тип должен быть полным. В некоторых реализациях используется static_assert, чтобы убедиться, что это так. Причина этого требования заключается в том, что вызов delete для неполного типа является неопределённым поведением в C++, если полный тип класса имеет нетривиальный деструктор или функцию освобождения, и компилятор не может знать, существуют ли такие функции и должны ли они быть вызваны.

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

Макрос Тестирования функциональностиЗначениеСтандартФункциональность
__cpp_lib_constexpr_memory202202L(C++23)constexpr конструктор и operator()

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

#include <algorithm>#include <memory>#include <vector>   int main(){// {// std::shared_ptr<int> shared_bad(new int[10]);// } // деструктор вызывает delete, неопределённое поведение   {std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());}// деструктор вызывает delete[], ok   {std::unique_ptr<int> ptr(new int(5));}// unique_ptr<int> использует default_delete<int>   {std::unique_ptr<int[]> ptr(new int[10]);}// unique_ptr<int[]> использует default_delete<int[]>   // может использоваться везде, где необходим функтор удаленияstd::vector<int*> v;for(int n =0; n <100;++n) v.push_back(new int(n));std::for_each(v.begin(), v.end(), std::default_delete<int>());}

[править]Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 2118 C++11 функции-элементы default_delete<T[]> отклоняли преобразования квалификации принимают

[править]Смотрите также

(C++11)
умный указатель с уникальной семантикой владения объектом
(шаблон класса)[править]
close