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 для освобождения памяти для одного объекта.delete[].Функции-элементы
создаёт объект default_delete (public функция-элемент) | |
| удаляет объект или массив (public функция-элемент) |
std::default_delete::default_delete
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> 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<T> из другого объекта std::default_delete. Этот конструктор будет участвовать в разрешении перегрузки, только если U* неявно преобразуется в T*.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()
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>| (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.delete[] для ptr. Эта функция будет участвовать в разрешении перегрузки, только если U(*)[] неявно преобразуется в T(*)[].В любом случае, если 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) |
умный указатель с уникальной семантикой владения объектом (шаблон класса) |