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.

De toda el Mapa de memoria comentado en el capítulo anterior..hay una parte de la memoria RMA que tiene unas zonas sobre las que vamos a comentar su función .

Estas zonas de memoria son:
  • 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.