2009-04-16 9 views
8

Estaba leyendo esta pregunta Deleting a const pointer y quería saber más sobre el comportamiento de delete. Ahora, según mi entendimiento:¿Cómo se soluciona el borrado de la constness del puntero?

delete expression obras en dos pasos:

  1. invocación destructor
  2. luego libera la memoria (a menudo con una llamada a free()) llamando al operador de borrar.

operator delete acepta un void*. Como parte de un programa de prueba sobrecargué operator delete y encontré que operator delete no acepta el puntero const.

Dado que el operador delete no acepta el puntero const y elimina internamente las llamadas operator delete, ¿cómo funciona Deleting a const pointer?

¿El delete usa const_cast internamente?

+0

@ aJ. ¡Buena pregunta! –

Respuesta

13

const_cast realmente no hace nada, es una forma de suprimir el gemido del compilador sobre la const-ness del objeto. eliminar palabra clave es una construcción de compilador, el compilador sabe qué hacer en este caso y no le importa la const-ness del puntero.

4

Como this answer dice, delete no es un método como cualquier otro, sino una parte del lenguaje para destruir objetos. const -ness no tiene relación con la destructabilidad.

1

delete es un operador que puede sobrecargar. Toma un puntero como argumento y libera la memoria, posiblemente usando free. El compilador lo permite si el puntero es const o no.

+5

Esto no es realmente correcto. Se debe establecer una distinción fina pero importante entre el operador 'delete' (no se puede cambiar) y la función' operator delete' (que puede ser).El primero llama al último pero no son * idénticos. –

+0

@Konrad Rudolph, sí, eso es cierto, pero no hace mucha diferencia. – Zifre

2

operator delete acepta el void *. Como parte de un programa de prueba sobrecargué la eliminación del operador y encontré que la eliminación del operador no acepta el puntero const.

¿Cómo trataste esto? Ciertamente no aceptar punteros const:

#include <memory> 

int main() { 
    void* const px = 0; 
    delete px; 
    ::operator delete(px); 
} 

Este código es correcto, compila (aunque con una advertencia justificada) y lo ejecuta.

EDITAR: Leyendo el artículo original - que no estamos hablando de un puntero constante pero un puntero a const, que es otra cosa. La razón por la cual esto tiene que funcionar se describe allí. En cuanto a por qué está funcionando: otros han dicho esto.

-1

delete hace una llamada para desasignar la memoria a la que apunta el puntero, no cambia el valor del puntero ni del objeto. Por lo tanto, delete no tiene nada que ver con const -ness del puntero u objeto apuntado.

Cuestiones relacionadas