Actualmente estoy estudiando COM y el siguiente código me confundió.¿Cómo podría un método miembro eliminar el objeto?
STDMETHODIMP _(ULONG) ComCar::Release()
{
if(--m_refCount==0)
delete this; // how could this "suicide" deletion be possible?
return m_refCount;
}
Me pregunto cómo podría ser posible eliminar una instancia de objeto dentro de su método de miembro? Así que hice el siguiente experimento:
class A
{
public:
void Suicide(void);
void Echo(void);
char name;
};
void A::Echo(void)
{
::printf("echo = %c\n",name);
}
void A::Suicide(void)
{
delete this;
}
int main(void)
{
A a;
a.name='a';
a.Suicide(); //failed
}
Y la ejecución lo hace fracasado en a.Suicide(). El informe de depuración dice "Falló la aserción de depuración". ¿Podría alguien arrojar algo de luz sobre mí? Porque soy totalmente novato en COM.
Un hilo relacionado es aquí: Question about COM Release() method
Y la solución simple es simplemente devolver 0, por supuesto. – GManNickG
Gracias, Michael, ya que mencionaste "alloacation dinámica", estoy adivinando si hay alguna "asignación estática" opuesta? ¿Qué es y cuál es la diferencia? quizás es difícil explicarlo en una palabra. ¿Podría darme alguna referencia para seguir estudiando? muchas gracias. : D – smwikipedia
@GMan: Solo quiero aclarar que quiere decir: 'if (--m_refCount == 0) {eliminar esto; return 0; } return m_refCount; '. No puede simplemente cambiar la declaración de devolución para 'return 0;'. – Dan