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)
Definido en el encabezado <memory>
template < class T > struct default_delete ;
(1) (desde C++11)
template < class T > struct default_delete < T [ ] > ;
(2) (desde C++11)

std::default_delete es la política de destrucción predeterminada utilizada por std::unique_ptr cuando no se especifica un deleter. Las especializaciones de default_delete son clases vacías en implementaciones típicas, y se utilizan en la optimización de clase base vacía .

1) El default_delete no especializado utiliza delete para desasignar memoria para un objeto individual.
2) También se proporciona una especialización parcial para tipos de array que utiliza delete [ ] .

Contenidos

Funciones miembro

(constructor)
construye un objeto default_delete
(función miembro pública)
operator()
elimina el objeto o array
(función miembro pública)

std::default_delete:: default_delete

constexpr default_delete ( ) noexcept = default ;
(1)
Especializaciones de la plantilla principal
template < class U >
default_delete ( const default_delete < U > & d ) noexcept ;
(2) (desde C++11)
(constexpr desde C++23)
Especializaciones para arrays
template < class U >
default_delete ( const default_delete < U [ ] > & d ) noexcept ;
(3) (desde C++11)
(constexpr desde C++23)
1) Construye un objeto std::default_delete .
2) Construye un objeto std::default_delete<T> a partir de otro objeto std::default_delete .
Esta sobrecarga participa en la resolución de sobrecarga solo si U* es convertible implícitamente a T* .
3) Construye un objeto std::default_delete<T[]> a partir de otro objeto std::default_delete<U[]> .
Esta sobrecarga participa en la resolución de sobrecarga solo si U(*)[] es convertible implícitamente a T(*)[] .

Parámetros

d - un deleter del cual copiar

Notas

La plantilla del constructor de conversión de std::default_delete hace posible la conversión implícita de std:: unique_ptr < Derived > a std:: unique_ptr < Base > .

std::default_delete:: operator()

Especializaciones de plantilla primaria
void operator ( ) ( T * ptr ) const ;
(1) (desde C++11)
(constexpr desde C++23)
Especializaciones de array
template < class U >
void operator ( ) ( U * ptr ) const ;
(2) (desde C++11)
(constexpr desde C++23)
1) Llama a delete en ptr .
2) Llama a delete [ ] en ptr .
Esta sobrecarga participa en la resolución de sobrecarga solo si U(*)[] es convertible implícitamente a T(*)[] .
Si U es un tipo incompleto, el programa está mal formado.

Parámetros

ptr - un objeto o array a eliminar

Excepciones

No ofrece garantías de excepción.

Invocación sobre Tipos Incompletos

En el punto del código donde se llama al operator ( ) , el tipo debe estar completo. En algunas implementaciones se utiliza un static_assert para asegurar que este sea el caso. La razón de este requisito es que llamar a delete en un tipo incompleto es comportamiento indefinido en C++ si el tipo de clase completo tiene un destructor no trivial o una función de desasignación, ya que el compilador no tiene forma de saber si tales funciones existen y deben ser invocadas.

Notas

Macro de prueba de características Valor Estándar Característica
__cpp_lib_constexpr_memory 202202L (C++23) constexpr constructor y operator ( )

Ejemplo

#include <algorithm>
#include <memory>
#include <vector>
int main()
{
//  {
//      std::shared_ptr<int> shared_bad(new int[10]);
//  } // el destructor llama a delete, comportamiento indefinido
    {
        std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
    } // OK: el destructor llama a delete[]
    {
        std::unique_ptr<int> ptr(new int(5));
    } // unique_ptr<int> usa default_delete<int>
    {
        std::unique_ptr<int[]> ptr(new int[10]);
    } // unique_ptr<int[]> usa default_delete<int[]>
    // default_delete puede usarse en cualquier lugar donde se necesite un functor de eliminación
    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>());
}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2118 C++11 las funciones miembro de las especializaciones de array rechazaban conversiones de calificación aceptar

Véase también

(C++11)
puntero inteligente con semántica de propiedad única de objetos
(plantilla de clase)