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

std::default_delete

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, 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
 
 
<tbody> </tbody>
Определено в заголовочном файле <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 функция-элемент) [править]
удаляет объект или массив
(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[]>)
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()

<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[]>)
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[]> отклоняли преобразования квалификации принимают

Смотрите также

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