[C con Clase] [C con clase] ¿exit() libera memoria dinámica?

Steven Davidson srd4121 en njit.edu
Jue Jul 30 22:46:40 CEST 2009


Hola David,

David Inocente Romero Escalona wrote:
> En primer lugar, muchas gracias por tu completa respuesta, Steven.
> Creo que ya sé por qué he vuelto a esta lista de correo...
> 

De nada; para eso estamos :)

> En mi aplicación, las reservas de memoria de forma dinámica  se 
> realizan en una sola clase C++ (que modeliza una lista de números
> reales dinámica, es decir, que puede crecer en tiempo de ejecución).
> Esta clase define adecuadamente su método destructor para que libere
> toda la memoria que haya podido reservar dinámicamente. Igualmente,
> todos los métodos de la clase tienen especial cuidado en no dejar
> zonas de memoria reservadas dinámicamente sin liberar.
> 
> En ningún otro punto de la aplicación se realiza reserva dinámica de
> memoria alguna. Todos mis objetos 3D (que son objetos de clases C++)
> que necesitan usar una lista dinámica de números reales tienen un
> objeto miembro de la clase mencionada que maneja la memoria dinámica.
> 
> Además, todos los objetos que creo los creo usando memoria estática
> (es decir, sin reservar memoria en tiempo de ejecución); de esta
> forma:
> 
> Objeto3D objeto3D(<parámetros necesarios>);
> 
> Por lo tanto, según lo último que comentas, no debo destruir objeto 
> alguno (aunque ese objeto contenga un objeto que a su vez ha
> reservado memoria dinámicamente). Al terminar el proceso, se
> destruirán todos los objetos creados (por lo que se llamará a sus
> destructores y, éstos, acabarán liberando la memoria reservada en
> tiempo de ejecución).
> 
> ¿estoy en lo correcto?
> 

Perfecto. Si los destructores gestionan la liberación de la memoria 
dinámica, entonces el "exterior" no tiene que preocuparse. Al fin y al 
cabo, se trata de una gestión interna del objeto, el cual debe hacer 
autónomamente.

> Por cierto, ¿quién envía el mensaje destructor a todos los objetos
> que se hayan creado al terminar el proceso? ¿el compilador de C++
> introduce código objeto que se encarga de realizarlo?
> 

Sí. El compilador es quien se encarga, ya que este sistema está 
establecido por el lenguaje, C++.


Para zanjar este tema, se me olvidó comentar que existe la 
clase-plantilla 'auto_ptr' que podría servir para lo que mencionas. Esta 
plantilla representa el concepto de un "puntero inteligente". 
Básicamente, se comporta como un puntero, pero generará una clase la 
cual destruirá la memoria dicho puntero apunta, valga la redundancia. 
Por ejemplo,

int main()
{
   auto_ptr< Info > pLista( new Info );
   ...
   return 0;
}

La clase 'auto_ptr<Info>' se encargará de destruir la memoria creada 
dinámicamente al terminar el ámbito.

Sé que no necesitas esto, pero quería completa lo que dije en mi 
anterior mensaje.


Espero haber aclarado las dudas.

Steven





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