Espacios de nombres
Variantes
Acciones

Expresión delete

De cppreference.com
< cpp‎ | language
 
 
 
 

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)
1) Destruye un objeto no-array creado por una expresión new.
2) Destruye un array creado por una expresión 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):

  • Si al menos una de las funciones de desasignación es un delete de destrucción, se ignoran todos los delete que no son delete de destrucción.
(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 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)
  • De otra forma, 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 de clase con un destructor no trivial o un array de los mismos (posiblemente 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 información de tamaño (con un parámetro de tipo std::size_t) o la función de desasignación global sin información 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ó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 siempre se interpreta como la forma de delete para arrays, una expresión lambda con la lista de captura vacía inmediatamente después de delete debe estar entre paréntesis.

// delete []{return new int; }(); // ERROR de análisis
delete ([]{return new int; })(); // de acuerdo
(desde C++11)


[editar] Palabras clave

delete

[editar] Véase también