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
представляют собой пустые классы в типичных реализациях и используются в оптимизации пустого базового класса.
default_delete
использует 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[]> ) | |
std::default_delete
.std::default_delete
. Этот конструктор будет участвовать в разрешении перегрузки, только если 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[]> ) | |
delete
для ptr.В любом случае, если U неполный тип, программа некорректна.
Параметры
ptr | — | объект или массив для удаления |
Исключения
Не гарантирует никаких исключений.
[править]Вызов Неполных Типов
В момент вызова operator() в коде тип должен быть полным. В некоторых реализациях используется static_assert
, чтобы убедиться, что это так. Причина этого требования заключается в том, что вызов delete для неполного типа является неопределённым поведением в C++, если полный тип класса имеет нетривиальный деструктор или функцию освобождения, и компилятор не может знать, существуют ли такие функции и должны ли они быть вызваны.
[править]Примечание
Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
---|---|---|---|
__cpp_lib_constexpr_memory | 202202L | (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) | умный указатель с уникальной семантикой владения объектом (шаблон класса) |