Expresión delete
Destruye un objeto u objetos previamente asignados por la expresión new
y libera el área de memoria obtenida.
Contenido |
[editar] Sintaxis
:: (opcional) delete expresión
|
(1) | ||||||||
:: (opcional) delete [] expresión
|
(2) | ||||||||
new
.[editar] Explicación
Para el primer formato (no-array), la expresión debe ser un puntero a un tipo de objeto o a un tipo de clase contextualmente convertible implícitamente a dicho puntero, y su valor debe ser nulo o puntero a un objeto de no-array creado con una expresión new
, o un puntero a un subobjeto base de un objeto de no-array creado con una expresión new
. Si la expresión es cualquier otra cosa, incluyendo si el puntero se obtuvo mediante el formato de array de la expresión new
, el comportamiento es indeterminado.
Para el segundo formato (array), la expresión debe ser un valor de puntero nulo o un valor de puntero previamente obtenido mediante la forma de array de la expresión new
. Si la expresión es cualquier otra cosa, incluyendo si el puntero se obtuvo mediante la forma no-array de la expresión new
, el comportamiento es indefinido.
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 indefinido.
Si la expresión no es un puntero nulo y la función de desasignación no es un delete
(desde C++20) de destrucción, la expresión delete
invoca el destructor (si es que lo hay) para el objeto que se está destruyendo, o para cada elemento del array que se está destruyendo (empezando por el último elemento hasta el primer elemento del array).
Después de eso, independientemente de si se lanzó o no una excepción por cualquier destructor, la expresión delete
invoca la función de desasignación: ya sea operator delete (para la primera versión de la expresión) u operator delete[] (para la segunda versión), a menos que la expresión new
se combine 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 la clase, si existen, se encuentran antes que las globales. Si ::
está presente en la expresión delete
, solo se examina el espacio de nombres global por 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 (véase función de deasignación para una descripción más detallada de esas funciones y sus efectos):
|
(desde C++20) |
|
(desde C++17) |
- Si las funciones de desasignación encontradas son especificas de la clase, se prefiere una función de desasignación específica de la 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)
|
(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ón se 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 un 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 un puntero a la clase base del objeto que fue asignado mediante new, el destructor de la clase base debe ser virtual, en otro caso el comportamiento es indefinido.
[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 []{return new int; }(); // ERROR de análisis delete ([]{return new int; })(); // de acuerdo |
(desde C++11) |