Punteros
3. El heap y la memoria dinámica
Donde mayor potencia desarrollan los punteros de C++ es cuando se unen al concepto de memoria dinámica.Cuando se inicia la ejecución de un programa, el sistema operativo carga el código ejecutable en una zona libre de la memoria reservando además varias zonas para almacenar los datos que necesite durante su ejecución.
- El área del código.
- Una
zona de datos para almacenar las variables globales y las constantes,
reservando el espacio justo ya que se conoce en tiempo de
compilación.
- El área de datos estáticos.
- Una zona para las llamadas que almacenará los parámetros de las
funciones, las variables locales y los valores de retorno de las
funciones ó para intercambiar datos entre funciones.
- La pila de llamadas (call stack , LIFO).
- Una zona para las llamadas que almacenará los parámetros de las
funciones, las variables locales y los valores de retorno de las
funciones ó para intercambiar datos entre funciones.
- El área de datos dinámicos (heap o montón).
- Una
zona para la gestión dinámica de la memoria que se solicita durante
la ejecución. Por ejemplo en C++ con el operador “new”. Para liberar esta porción de memoria se usa delete.
De manera gráfica lo podemos ver...
Una vez que el sistema operativo ha reservado las zonas de memoria y ha cargado el código del ejecutable, el programa está listo para ser ejecutado.
El S.O indicará a la CPU que debe apuntar el "contador" o registro del puntero de instrucciones a la primera instrucción del código (el punto de entrada de las aplicaciones, la función main), y que debe apuntar con su puntero de pila a la primera dirección de memoria reservada para la pila (stack).
INFORMACIÓN A TENER EN CUENTA:
Hay una regla de oro cuando se usa memoria dinámica, toda la memoria que se reserve durante el programa hay que liberarla antes de salir del programa. No seguir esta regla es una actitud muy irresponsable, y en la mayor parte de los casos tiene consecuencias desastrosas. No se fíen de lo que diga el compilador, de que estas variables se liberan solas al terminar el programa, no siempre es verdad.
Veremos
con mayor profundidad los operadores "new" y "delete", que justamente permiten reservar y liberar memoria.