Espacios de nombres
Variantes
Acciones

expresión delete

De cppreference.com
< cpp‎ | language

Destruye objeto(s) previamente asignados por la expresión new y libera el área de memoria obtenida.

Contenido

[editar] Sintaxis

::(opcional)    delete    expression (1)
::(opcional)    delete [] expression (2)
1) Destruye un objeto no matriz creado por una expresión new.
2) Destruye una matriz creada por una expresión new[].

[editar] Explicación

Para el primer formato (no matriz), la expresión debe ser un puntero a un tipo objeto o a un tipo clase contextualmente convertible implícitamente a dicho puntero, y su valor debe ser null o puntero a objeto no matriz creado con una expresión new, o un puntero a un subobjeto base de un objeto no matriz creado con una expresión new. Si la expresión es cualquier otra cosa, incluyendo si el puntero se obtuvo mediante el formato de matriz de la expresión new, el comportamiento es indeterminado.

Para el segundo formato (matriz), la expresión debe ser un valor puntero nulo o un valor puntero previamente obtenido mediante la forma de matriz de la expresión new. Si la expresión es cualquier otra cosa, incluyendo si el puntero se obtuvo mediante la forma no matriz de la expresión new, el comportamiento es indeterminado.

El resultado de la expresión siempre tiene tipo void.

Si el objeto que se está eliminando tiene un tipo de clase incompleto en el punto de eliminación, y la clase completa tiene un destructor no trivial o una función de desasignación, el comportamiento es indeterminado.

Si la expresión no es un puntero nulo y la función de desasignación no es un delete destructor (desde C++20), la expresión delete invoca el destructor (si hay) para el objeto que se está destruyendo, o para cada elemento de la matriz que se está destruyendo (empezando por el último elemento hasta el primer elemento de la matriz).

Después, se lanzara o no una excepción por un destructor, la expresión delete invoca la función de desasignación: operator delete (para la primera versión de la expresión) o operator delete[] (para la segunda versión), a menos que la expresión new se combinara con otra expresión new (desde C++14)

El nombre de la función de desasignación se busca en el ámbito del tipo dinámico del objeto apuntado por la expresión, lo que significa que las funciones de desasignación específicas de clase, si existen, se encuentran antes que la global. Si está presenta :: en la expresión delete, solo se examina el espacio de nombres global en esta búsqueda.

Si la búsqueda encuentra más de una función de desasignación, se selecciona la función a llamar como sigue (ver función de deasignación para un descripción más detallada de esas funciones y sus efectos):

  • Si al menos una de las funciones de desasignación es un delete destructor, se ignoran todos los delete no destructores.
(desde C++20)
  • Si el requerimiento de alineación del tipo excede __STDCPP_DEFAULT_NEW_ALIGNMENT__, se prefieren las funciones de desasignación con información de alineamiento (con un parámetro de tipo std::align_val_t) . Para otros tipos, se prefieren funciones de desasignación sin información de alineamiento (sin un parámtero de tipo std::align_val_t).
  • Si se encuentran más de una de las funciones preferidas, solamente se consideran las funciones preferidas en el siguiente paso.
  • Si no se encuentran funciones preferidas, se consideran las no preferidas en el siguiente paso.
  • Si solo queda una función, se selecciona la misma.
(desde C++17)
  • Si las funciones de desasignación encontradas son especificas de clase, se prefiere una función de desasignación específica de clase sin información de tamaño (sin un parámetro de tipo std::size_t) a una función de desasignación específica de clase con información de tamaño (con un parámetro de tipo std::size_t)
  • En otro caso, la búsqueda alcanza el ámbito global, y:
  • Si el tipo es completo y si, para delete[] solamente, el operando es un puntero a un tipo clase con un destructor no trivial o un conjunto de los mismos (que puede ser multidimensional), se selecciona la función global con información de tamaño (con un parámetro de tipo std::size_t).
  • En otro caso, no se especifica si se selecciona la función de desasignación global con conocimiento de tamaño (con un parámetro de tipo std::size_t) o la función de desasignación global sin conocimiento del tamaño (sin un parámetro de tipo std::size_t).
(desde C++14)

El puntero a bloque de almacenamiento a reclamar se pasa a la función de desasignación que fue seleccionada por el proceso anterior como primer argumento. El tamaño del bloque se pasa como argumento opcional std::size_t. El requerimiento de alineamiento se pasa como el argumento opcional std::align_val_t. (desde C++17)

Si la expresiónse evalúa como puntero nulo, no se llama a los destructores, y la función de desasignación puede ser llamada o no (lo define la implementación), pero se garantiza que las funciones de desasignación por defecto no hacen nada cuando reciben un puntero nulo.

(hasta C++14)

Si la expresión se evalúa como puntero nulo, no se llama a los destructores, y no se llama a la función de desasignación.

(desde C++14)

Si la expresión se evalúa como puntero a la clase base del objeto que asignado mediante new, el destructor de la clase base debe ser virtual, en otro caso el comportamiento es indeterminado.

[editar] Notas

Un puntero a void no se puede eliminar porque no es un puntero a un tipo de objeto completo.

Debido a que un par de corchetes siguiendo a la palabra reservada delete siempre se interpreta como la forma matriz de delete, una expresión lambda con la lista de captura vacía debe estar entre paréntesis inmediatamente después de delete.

// delete []{return new int; }(); // error de traducción
delete ([]{return new int; })(); // OK
(desde C++11)


[editar] Palabra reservada

delete