new destructores delete constructores c++ constructor destructor delete-operator self-destruction

delete - constructores y destructores c++ pdf



"Eliminar esto" en el constructor (2)

¿Qué sucede realmente cuando ejecuto este código?

class MyClass { MyClass() { //do something delete this; } }


Resulta que, en este caso particular, el código es legal, pero usted está ε-away de un comportamiento indefinido.

El estándar de C ++ define la noción de "duración" de un objeto como el tiempo entre el cual su constructor ha terminado de ejecutarse y cuando el destructor comienza a ejecutarse. También establece explícitamente (en §3.8 / 5) que

Antes de que haya comenzado la vida útil de un objeto [...] Si el objeto será o fue de un tipo de clase con un destructor no trivial, y el puntero se utiliza como el operando de una expresión de eliminación, el programa tiene un comportamiento indefinido .

Como la duración de un objeto no ha comenzado hasta que el constructor finaliza, dentro del constructor this puntero al que se ha referido no ha comenzado su ciclo de vida, tratar de delete en este caso es totalmente seguro. Sin embargo, si escribe un destructor para la clase, entonces se encontrará inmediatamente con un comportamiento indefinido.

Además, si cambia el constructor para que intente hacer referencia a cualquiera de los miembros de datos de la clase después de eliminar el objeto, obtendrá un comportamiento indefinido. Si el objeto fue asignado en la pila, obtendrás un comportamiento indefinido. Si el objeto es estático, obtendrá un comportamiento indefinido. Si el objeto se asignó usando new , entonces el puntero que el cliente volverá a encontrar será inválido y su uso dará como resultado un comportamiento indefinido. ¡En general, no intentes hacer esto!


Suponiendo que su objeto nunca se hereda por nada, esto debería funcionar bien. Su constructor se ejecuta y luego se llama inmediatamente al destructor. Si algo hereda este objeto, se romperá ya que este constructor será llamado antes que el constructor heredado.