Spec-Zone.ru › C++

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
(открытая функция-член)
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]);
//  } // the destructor calls delete, undefined behavior
    
    {
        std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
    } // OK: the destructor calls delete[]
    
    {
        std::unique_ptr<int> ptr(new int(5));
    } // unique_ptr<int> uses default_delete<int>
    
    {
        std::unique_ptr<int[]> ptr(new int[10]);
    } // unique_ptr<int[]> uses default_delete<int[]>
    
    // default_delete can be used anywhere a delete functor is needed
    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 Применён к Опубликованное поведение Исправленное поведение
LWG 2118 C++11 функции-члены специализаций для массивов отклоняли преобразования с добавлением квалификаторов принимать

См. также

unique_ptr
(C++11)
умный указатель с семантикой единоличного владения объектом
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/default_delete

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API