[C con Clase] Liberación de memoria.

Salvador Pozo salvador en conclase.net
Vie Sep 23 10:05:38 CEST 2011


El pasado 2011-09-23 07:05:32, Walter H. escribió:
 
WH> Hola compañeros, tengo una duda con respecto a memoria dinámica; estoy trabajando en c++ junto con el framework de Qt.
WH> Al realizar esta operación estaría perdiendo (o dejando inaccesible) memoria por no liberarla?
WH> const char *cadena = "prueba";
WH> cadena = "hilera nueva";

Hola:
Cuando se crean cadenas de esta forma, suceden varias cosas que hay que tener en cuenta:

Las cadenas literales se crean en la fase de compilación, y su valor se guarda junto con el código. Cuando el programa se carga en memoria, generalmente, las cadenas se almacenan en la misma zona que el código.

Esto nos obliga a declararlas constantes, como bien has indicado en el ejemplo. A su vez, esto significa que no se puede modificar su contenido.

Es un error frecuente intentar modificar el valor de esas cadenas. Los compiladores, (al menos los compiladores que había hasta hace relativamente poco tiempo), no se quejaban si se intentaba modificar estas cadenas. Generalmente no pasaba nada, siempre que la nueva cadena no fuera de mayor longitud que la original. Pero si se intenta almacenar una cadena de mayor longitud, los resultados suelen ser catastróficos, ya que se sobrepasa el espacio reservado para la cadena y se modifican los valores de otras variables o incluso del código ejecutable.

Al no estar en la zona del "montón" esta memoria tampoco puede ser liberada. 

Las cadenas literales se liberan junto con el código ejecutable cuando termina la ejecución del programa.

De hecho, al no tratarse de una memoria reservada dinámicamente, tampoco podría ser liberada mediante funciones u operadores.

Siempre pongo el mismo ejemplo para ilustrar por qué estas cadenas literales deben considerarse constantes. Imagina que este código forma parte de un programa que se almacenará en una memoria ROM, por ejemplo, de un autómata. Todo el código, y los datos literales se almacenan en esa ROM, por lo tanto, podremos acceder a esos datos para leerlos, y podremos hacer que nuestros punteros apunten a ellos o a cualquier otra cadena, pero nunca podremos liberarlos ni modificar sus valores.

Por otra parte, C++ no dispone de "recolector de basura", es decir, el programador tiene la responsabilidad de dejar todo limpio. Si en el código no hay una instrucción 'delete' para una cadena, nadie liberará su memoria por nosotros.

En los sistemas operativos modernos se reservan ciertos recursos para cada aplicación, de modo que cuando la aplicación termina, se liberan automáticamente todos los recursos utilizados por ella. Pero esto se debe considerar sólo como un sistema de seguridad del sistema operativo, y un programador responsable no debe dar por supuesto que esto será así con la memoria ni con otros recursos (puertos, dispositivos, etc). Tampoco sucederá eso si programamos para sistemas operativos más primitivos, como los que puedan tener autómatas programables, ordenadores viejos, robots, etc.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


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