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

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++14)
(C++11)
(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)
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[]>)
1) Вызывает delete для ptr.
2) Вызывает 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[]> отклоняли преобразования квалификации принимают

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

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