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
для освобождения памяти для одного объекта.
Содержание |
Функции-члены
|
(constructor)
|
создает объект
default_delete
(публичная функция-член) |
|
operator()
|
удаляет объект или массив
(публичная функция-член) |
std::default_delete:: default_delete
|
constexpr
default_delete
(
)
noexcept
=
default
;
|
(1) | |
|
Специализации основного шаблона
|
||
|
template
<
class
U
>
default_delete ( const default_delete < U > & d ) noexcept ; |
(2) |
(начиная с C++11)
(constexpr начиная с C++23) |
|
Специализации для массивов
|
||
|
template
<
class
U
>
default_delete ( const default_delete < U [ ] > & d ) noexcept ; |
(3) |
(начиная с C++11)
(constexpr начиная с C++23) |
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()
|
Основные специализации шаблона
|
||
|
void
operator
(
)
(
T
*
ptr
)
const
;
|
(1) |
(начиная с C++11)
(constexpr начиная с C++23) |
|
Специализации для массивов
|
||
|
template
<
class
U
>
void operator ( ) ( U * ptr ) const ; |
(2) |
(начиная с C++11)
(constexpr начиная с C++23) |
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[]>()); } // OK: деструктор вызывает delete[] { 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[]> // default_delete может использоваться везде, где нужен функтор удаления 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++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2118 | C++11 | member functions of the array specializations rejected qualification conversions | accept |
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 2118 | C++11 | функции-члены специализаций array отвергали квалификационные преобразования | принимают |
Смотрите также
|
(C++11)
|
умный указатель с семантикой уникального владения объектом
(шаблон класса) |