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 ) |
|
constexpr void 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> constexpr void 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) |
умный указатель с уникальной семантикой владения объектом (шаблон класса) |