Título: (Pregunta) Que pasa con la memoria asignada al cerrar el programa Publicado por: Seyro97 en 26 Mayo 2015, 02:40 am Hola a todos. Hoy tengo una duda/curiosidad que quería resolver.
La duda es la siguiente: ¿Las variables (arrays, clases...) de desasignan al cerrar el programa? También las variables previamente asignadas con malloc se desasignan al cerrar el programa, o necesitas eliminarlas tu mismo? Gracias Título: Re: (Pregunta) Que pasa con la memoria asignada al cerrar el programa Publicado por: engel lex en 26 Mayo 2015, 02:45 am realmente no se desasignan... simplemente el SO marca ese espacio como "usable" y si otro programa entra, sobreescribe ese valor "basura" así como tu lo hiciste con el tuyo
ej, prueba este programa Código
por eso es importante siempre inicializar variables Título: Re: (Pregunta) Que pasa con la memoria asignada al cerrar el programa Publicado por: Seyro97 en 26 Mayo 2015, 02:50 am Lo preguntaba para enfocarme en la asignación dinámica con malloc (y en c++ con new). A lo mejor por ser dinámica, por alguna razón, necesitan ser eliminadas. No se muy bien como va :P
La duda viene originada de que a medida de que va pasando el tiempo, parece que mi memoria RAM se va llenando (ej.: empiezo al 19% y ya voy por el 21%). Esto pasa siempre. Título: Re: (Pregunta) Que pasa con la memoria asignada al cerrar el programa Publicado por: engel lex en 26 Mayo 2015, 02:56 am malloc lo que hace es decirle al sistema operativo que le de más ram al programa (es decir, que la marque como "usada" para que nadie más la accese y darle el permiso a el programa)
cuando se cierra el programa, queda disponible Título: Re: (Pregunta) Que pasa con la memoria asignada al cerrar el programa Publicado por: Seyro97 en 26 Mayo 2015, 03:01 am Vale. Gracias :P
Solo para aclarar. Entonces, no tengo que hacer nada de gestión de memoria al cerrar el programa? Título: Re: (Pregunta) Que pasa con la memoria asignada al cerrar el programa Publicado por: engel lex en 26 Mayo 2015, 03:05 am Vale. Gracias :P Solo para aclarar. Entonces, no tengo que hacer nada de gestión de memoria al cerrar el programa? en general no... pero se hace dentro del tiempo del programa para que no se te acumule basura, ya que si declaras muchas veces una misma variable (ej en un ciclo), depende de la gestion del compilador cada instancia puede pedir más y más ram para no destruir las viejas (si tu no las destruiste tal vez es porque las accedes) Título: Re: (Pregunta) Que pasa con la memoria asignada al cerrar el programa Publicado por: Seyro97 en 26 Mayo 2015, 03:13 am Estupendo!
Título: Re: (Pregunta) Que pasa con la memoria asignada al cerrar el programa Publicado por: Peregring-lk en 26 Mayo 2015, 17:23 pm Yo tampoco es que sea un experto, pero el funcionamiento general (hasta lo que yo sé) de la memoria de un programa es el siguiente:
Respecto al montículo también funciona como una pila de platos, pero un poco diferente; algo así como una pila fragmentada. En teoría (en realidad, cada SO puede tener sus propias políticas para manejar el montículo), cada vez que tú pides al SO un nuevo dato dinámico (`malloc`/`new`), él lo coloca encima del último dato dinámico creado. Si se borra un objeto dinámico (free/delete), se queda un hueco libre en medio de la pila (y reutilizable), pero el tope del montículo sigue siendo el mismo. Ésto se diferencia de la pila en que la pila funciona como un muelle que se estira y se encoje a medida que se llaman a nuevas funciones y éstas terminan, mientras que el montículo es una "pila fija", destruir un objeto nunca "encoje" el montículo, sino que deja huecos entre medio. Cuando has solicitado tantos objetos que el montículo ha llegado a su tope, entonces cuando solicites un nuevo objeto dinámico al SO, éste empezará a buscar un hueco en medio del montículo lo suficientemente grande para dicha variable, y lo colocará ahí. Si no quedase un hueco lo suficientemente grande, la verdad es que no sé qué haría el sistema operativo (puede que reordene el montículo para juntar huecos y conseguir un hueco más grande --al igual que cuando desfragmentas un disco duro; lo que no creo, porque invalidaría los punteros; o puede que sencillamente te diga que no queda memoria, ¡aunque la suma de huecos sea lo suficientemente grande!). Por último, hay que tener en cuenta que, como el montículo puede ser enorme, el SO te "virtualiza" el montículo para que lo veas como una pila contigua con huecos, cuando en realidad, cada "trozo" de montículo puede estar colocado en diferentes lugares de la RAM y memoria virtual (disco duro). Si has reservado memoria para un objeto, y éste se encuentra actualmente en disco y no en RAM, y quieres "utilizar" dicho objeto (acceder a un campo de él por ejemplo), el SO cogerá el "trozo" de memoria virtual (página), que contiene a tu objeto, y lo colocará en RAM, y posiblemente, cogerá un trozo de RAM que ahora mismo tu programa no esté utilizando, y lo enviará a disco como intercambio (aunque si hay suficiente RAM disponible, seguramente evitará ésto último). Así que el sistema operativo se encarga de mover las páginas de memoria virtual entre disco y RAM a medida que vas utilizando tus objetos dinámicos. Por ese motivo, aunque el montículo sea enorme y uno tenga la tentación de enviarlo todo allí, utilizar el montículo siempre es MUCHÍSIMO más lento que utilizar la pila. Ahora, teniendo en cuenta todo ésto, ¿qué ocurre con el montículo (memoria dinámica) cuando el programa termina? Pues el SO mantiene un rastreo de toda la memoria dinámica que ha consumido el programa, y cuando éste termina, la elimina. Así que un programa finalizado no dejará memoria utilizada, ni en RAM, ni en memoria virtual. Con la pila pasa lo mismo, y además con una ventaja. Como la pila nunca está en memoria virtual, y es como un bloque fijo en la RAM, solo hay que quitar dicho bloque de la RAM y listo. Eso no supone ningún problema para ningún SO, y no necesitan "rastrear" nada, con saber dónde empieza la pila y donde acaba es suficiente (y por éste motivo, los SOs restringen los tamaños de las pilas --compara 8MB de pila con 4 gigas de RAM; para que todas las pilas de todos los programas y del SO estén en RAM siempre). De todas formas, aunque el SO libere toda la memoria de tu programa sin problemas, DEBES liberar toda memoria que hayas consumido en cuánto ya no la necesites. No solo para evitar el riesgo de que tu propio programa se quede sin memoria (lo cuál es muy raro, ya que con 32 bits tienes 4GB de RAM, y si tu arquitectura es de 64bits, pues mucho más), sino para evitar el riesgo de que tu "ordenador como un todo", se quede sin memoria mientras tu programa está aún en ejecución. Date cuenta que, aunque cada programa tenga 4GB de RAM como máximo, tu programa podría ejecutarse en un ordenador con 2GB físicos de RAM (por que, por ejemplo, el dueño decidió no comprar otra tarjeta de memoria RAM adicional para completar los 4 GB). Además, la cantidad de memoria de disco que puede utilizar el SO también está limitado, y un usuario de tu programa puede tener configurado su sistema operativo para que la memoria virtual no consuma demasiado espacio en disco (el trozo de disco duro que el SO reserva para colocar páginas de memoria virtual se llama memoria de intercambio). Un motivo para hacer ésto, es que cuánto más pequeña sea la memoria de intercambio, más probable es que el SO coloque páginas de memoria virtual en RAM en vez de en disco (para evitar que la memoria virtual se llene), haciendo que todos los programas vayan más rápido. Sea por lo que sea, SIEMPRE borra tu memoria dinámica en cuánto no la necesites. Si los programadores no liberaran nunca la memoria porque el SO hace el resto, en cuánto tuvieses 4 o 5 programas abiertos, más todos los servicios y demonios que se ejecutan en segundo plano, más el propio sistema operativo en sí, podrías quedarte sin memoria (a no ser que cierres una de las aplicaciones). |