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

David Inocente Romero Escalona di.romero en hotmail.es
Vie Jul 31 14:32:09 CEST 2009


Una última duda sobre el tema de la reserva dinámica de memoria.

 

¿y si el programa termina anormalmente (por ejemplo, porque se aborta llamando a la función "abort()" ó porque recibe una señal de aborto y no la maneja)? ¿se sigue ejecutando el código objeto que añade el compilador de C++ para destruir todos los objetos que se hayan creado y sigan vivos?

 

Por cierto, ¿conoces algún programa/herramienta para win32 que permita saber si un cierto proceso tiene "fugas de memoria" (memory leaks)?

 

Saludos.


 
> Date: Thu, 30 Jul 2009 16:46:40 -0400
> From: srd4121 en njit.edu
> To: cconclase en listas.conclase.net
> Subject: Re: [C con Clase] [C con clase] ¿exit() libera memoria dinámica?
> 
> 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
> 
> 
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

_________________________________________________________________
¿Quieres ver los mejores videos de MSN? Enciende Messenger TV
http://messengertv.msn.com/mkt/es-es/default.htm
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090731/cef90667/attachment.html>


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