2010-12-15 21 views
8

posibles duplicados:
Is it OK to use "delete this" to delete the current object?
Should objects delete themselves in C++?Utilidad de 'eliminar este' en función miembro

me encontré con this pregunta sobre programmers.stackexchange y vio a la pregunta acerca de hacer una delete this; dentro de una función miembro.

Por lo que entiendo es generalmente un no-no, sin embargo, hay algunas circunstancias donde esto podría ser útil. ¿Cuándo sería útil algo así y cuáles son las razones técnicas para no hacerlo?

+0

Ver también http://stackoverflow.com/q/1866193/57428 y http://stackoverflow.com/q/1866461/57428 – sharptooth

Respuesta

5

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.

+0

Creo que realmente usa InterlockedDecrement, es decir, disminución atómica, de lo contrario no sería seguro para subprocesos . Además, AddRef y Release son funciones const mudable m_nRefs o no podría copiar objetos y aumentar su recuento de referencia correctamente. – CashCow

+0

@CashCow, tiene razón, pero simplemente lo mostraba como un ejemplo en lugar de mostrar el código * exacto que utiliza COM, sin embargo, he modificado mi respuesta para mostrar que es hipotética. –

0

Lo uso en mi manejo de mensajes. Es pre shared_ptr y deja que el mensaje decida si eliminarse a sí mismo (asíncrono) o desbloquear el remitente (sincrónico).

5

delete this; se usa comúnmente en patrones de conteo de referencias. El objeto se elimina cuando su recuento de referencia cae a cero. Está perfectamente bien siempre que no se haga más referencia al objeto que se está eliminando. También requiere que dicho objeto resida en la tienda heap/free.

+2

montón. quieres decir que el objeto debe residir en el montón. o como se lo conoce en la especificación C++: tienda gratuita. –

+0

@ Lenny222 No, debe asignarse con nuevo para ser eliminado con delete. – CashCow

+0

@Elemental - Reparado – doron

Cuestiones relacionadas