Duda con memoria dinamica.

leo
19 de Abril del 2010
Hola a todos, como va. Mi pregunta talves sea media tonta, pero hace tiempo que no me la puedo sacar de la cabeza; el tema es cuando asigno memoria en forma dinamica para alguna variable puntero, por ejemplo, si hago:
....
double *arreglo;
arreglo_ = (double*) malloc (sizeof(double) * 5000);
....
....
return 0;
Luego el programa termina y me olvido de liberar dicha memoria con un free(arreglo). Entonces no me queda claro si ese bloque de memoria queda inaccesible para siempre, o se libera automaticamente al cerrar el programa?
Puede ser que la memoria se pierda y de esta forma mi pc quede con menos memoria ram cada ves que me olvide de hacer free, o cada ves que un programa se interrumpe por algun error y tampoco llegue a liberar la memoria reservada?

Desde ya muchas.

Capitan Kirk
19 de Abril del 2010
Se supone que, al finalizar el programa, debería devolver al sistema operativo todos los recursos que ha utilizado, por lo que, aunque no liberes explícitamente la memoria al terminar el programa, los bloques reservados se devuelven al sistema. Pero no hay ninguna garantía de que esto sea así, de hecho es responsabilidad del programa devolver al sistema los recursos que le haya requerido. El compilador, supuestamente, añade a tu programa el código que necesita para pedir recursos al ejecutar el programa y el código para liberarlos al finalizar, pero no tienes ninguna garantía de que esto se efectúe de manera correcta.

Por ello, no conviene hacer lo que indicas que haces. No pasa nada en programas pequeños, pero si la aplicaciópn crece y las reservas de memoria se hacen en funciones llamadas varias veces y no se liberan, si que puedes encontrarte con que, en un momento dado, tu aplicación ya no puede obtener la memoria que va necesitando. Por ello, es conveniente liberar la memoria reservada conforme ya no se necesite. Un par de consejillos:

1. Cuando hagas una reserva de memoria, prepara inmediatamente el código para su liberación. Así no se te olvida.

2. Siempre que sea posible, libera los bloques de memoria reservados en orden inverso al de su creación. Esto puede ayudar a evitar la fragmentación de la memoria disponible.

Saludos,

leo
21 de Abril del 2010
Muchas gracias Capitan Kirk por la respuesta, ahora me quedó claro, y estoy mas tranquilo al momento de usar memoria dinamica, sigo tus consejos.
Nuevamente gracias por responder.
Saludos.