[C con Clase] Excepciones, memoria dinámica e invocación de destructores

Davidson, Steven srd4121 en njit.edu
Mie Mayo 24 16:49:26 CEST 2017


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 en 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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20170524/71343a8f/attachment.html>


Más información sobre la lista de distribución Cconclase