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)
(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]);
//  } // the destructor calls delete, undefined behavior
 
    {
        std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
    } // the destructor calls delete[], ok
 
    {
        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 Функции-члены default_delete<T[]> отклоняли преобразования квалификации принять

См. также

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

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

Spec-Zone.ru

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