Namespaces
Variants

std:: default_delete

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовочном файле <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 [ ] .

Содержание

Функции-члены

(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)
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()

Основные специализации шаблона
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)
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[]>());
    } // 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)
умный указатель с семантикой уникального владения объектом
(шаблон класса)