En general, es una mala idea ya que técnicamente está dentro de una función miembro cuando lo hace y de repente todos los miembros de esa clase ahora no son válidos. Obviamente, si no tocas nada después de la llamada delete this;
, estarás bien. Pero es muy fácil olvidar estas cosas, tratar de acceder a una variable miembro y obtener un comportamiento indefinido y pasar tiempo en el depurador.
Dicho esto, se utiliza en cosas como el modelo de objetos componentes de Microsoft (COM), cuando la liberación de un componente (NOTA: Esto no es exactamente lo que hacen como señala Cashcow y es sólo para fines ilustrativos):
void AddRef() { m_nRefs++; }
void Release()
{
m_nRefs--;
if(m_nRefs == 0)
delete this;
// class member-variables now deallocated, accessing them is undefined behaviour!
} // eo Release
Dicho esto, en C++ tenemos punteros inteligentes (como boost::shared_ptr
) para administrar la vida útil de los objetos para nosotros. Dado que COM es interproceso y accesible desde lenguajes como VB, los punteros inteligentes no eran una opción para el equipo de diseño.
Ver también http://stackoverflow.com/q/1866193/57428 y http://stackoverflow.com/q/1866461/57428 – sharptooth