Hilo
Entiendo que si uno implementa una ADT esta debería comportarse como los
tipos nativos y ser sus instancias destruidas al terminar su vida útil,
¿pero que pasa si el usuario de la clase declara un raw pointer para usar
new con un tipo de esa ADT? En principio el destructor será invocado...a
menos que se lance una excepción y esa memoria que se perdió. ¿ Cómo puedo
evitarlo? Seguidamente adjunto un ejemplo que ilustra el problema
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Excepciones, memoria dinámica e invocación de destructores (Steven Davidson) 2017-05-24 14:20:03
Hola José Antonio,
Siguiendo tu ejemplo, el destructor no se invocaría, al menos que se libere
la memoria. Es decir, si escribimos,
Complex* z2 = new Complex{ 6,1 };
delete z2;
Al liberar la memoria con 'delete', se destruye el objeto apuntado, y por
lo tanto, se invoca automáticamente su destructor.
Si quieres usar memoria dinámica para instanciar un objeto, pero quieres
que el destructor se invoque automáticamente sin tener que escribir
'delete', entonces podrías mirar las plantillas estándares para crear
"punteros inteligentes". Por ejemplo,
{
unique_ptr<Complex> ptr = make_unique<Complex>( 6,1 );
...
}
Al terminar el ámbito, se destruye el objeto 'ptr', cuyo destructor
destruye la memoria dinámicamente adjudicada al objeto 'Complex(6,1)'; y
por tanto, se invoca el destructor, '~Complex()'.
Espero haber aclarado la duda.
Steven
2017-05-24 4:26 GMT-04:00 José Antonio Martínez Escobedo <dracllop@gmail.com
> :
> Entiendo que si uno implementa una ADT esta debería comportarse como los
> tipos nativos y ser sus instancias destruidas al terminar su vida útil,
> ¿pero que pasa si el usuario de la clase declara un raw pointer para usar
> new con un tipo de esa ADT? En principio el destructor será invocado...a
> menos que se lance una excepción y esa memoria que se perdió. ¿ Cómo puedo
> evitarlo? Seguidamente adjunto un ejemplo que ilustra el problema
>
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ