std:: default_delete
|
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
.
default_delete
no especializado utiliza
delete
para desasignar memoria para un objeto individual.
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) |
std::default_delete
.
std::default_delete<T>
a partir de otro objeto
std::default_delete
.
U*
es convertible implícitamente a
T*
.
std::default_delete<T[]>
a partir de otro objeto
std::default_delete<U[]>
.
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) |
U(*)[]
es convertible implícitamente a
T(*)[]
.
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) |