[C con Clase] implementacion del patron Singleton

Programante programante en gmail.com
Mar Sep 30 13:27:31 CEST 2008


ZeLion escribió:
> Gracias por las respuestas, me has ampliado mucho el conocimiento de la
> funcionalidad, no obstante me surgen unas dudas que comentas.
>
> Yo siempre había entendido que en Windows (por poner un ejemplo) cuando
> haces uso del operador new, lo que hace el compilador es llamar a la api
> 'HeapAlloc' para alojar en el heap de la aplicación el objeto inicializado,
> con lo que para dejar libre ese monton otra vez, hace falta llamar a
> 'HeapFree' para liberar el monton de memoria usado.
>   
HeapAlloc y HeapFree trabajan con montones. Una clase ocupa mucho menos, 
sería más adecuado
compararlo con LocalAlloc y LocalFree(). new y delete llaman al malloc() 
y free() de C.
Los cuales normalmente implementan su propio sistema de reserva en 
bloques grandes para luego
darselo poco a poco a la aplicación, reutilizando la memoria que no usa, 
etc.
En concreto, es bastante común que al hacer free() la memoria no se 
devuelva al operativo, sino
que se mantenga en la aplicación para resolver futuras demandas de 
memoria, ya que así la reserva
será mucho más rápido.

> Ahora bien, nunca he tenido claro 100% si es en el espacio de direcciones
> del proceso o afecta al sistema entero.
>   
Reservas memoria en tu espacio de direcciones, pero la memoria del 
sistema es limitada, por lo que
al sistema le afecta en el sentido de que le estás quitando recursos. 
Tendrá menos memoria que ofrecer
a otras tareas, necesitará usar más swap, etc.

> ¿si reservas memoria con 'new' en una aplicación y no liberas con 'delete',
> al cerrar la aplicación se libera sola la memoria?
>   
Desde luego. Al cerrar el programa el operativo libera todos los 
recursos que este mantuviese abiertos.
Incluida la memoria utilizada.

> ¿Si lo anterior es cierto, como se forman entonces las perdidas de memoria
> conocidas como 'memory leaks'?
>   
Se producen dentro del mismo programa.
Suponte que Firefox reserver una memoria al abrir una página y no la 
libere al cerrarla.
A lo largo del día abres muchas páginas, por lo que se reserva mucha 
memoria, pero no toda ella
se libera al cerrar la pestaña. Por lo tanto el ejecutable de Firefox 
ocupa cada vez más espacio en
memoria.
Cuando se cierre el navegador, toda esa memoria será recuperada. Pero 
hay gente que lo tiene abierto
durante días y días...
Los reportes de los leaks de Firefox en su bugzilla resultan interesantes.

> ¿Ocurre lo mismo en un MAC o un Linux, ya que no conozco sus Apis?
>   
Si.

> Muchas gracias.
>   
De nada :)




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