Ver Mensaje Individual
  #4 (permalink)  
Antiguo 18/08/2010, 05:21
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Entendiendo alojamiento de memoria - C++

Por lo que yo he podido ver hasta ahora, la memoria, al ejecutar un programa C/C++, se organizxa de la siguiente manera (comenzando por las posiciones de memoria más bajas):

En primer lugar, el código del programa.

A continuación, el espacio necesario para las variables globales y estáticas (las declaradas como static, dentro o fuera de las funciones). Estas se inician a cero en la mayoría de sistemas.

Después, el heap. Aquí es donde se guardan los bloques de memoria reservados de forma dinámica (con malloc/new, u otras funciones de esta familia). El espacio ocupado en el heap crece hacia arriba, en teoría puede llenafrse toda la memoria disponible.

Finalmente, el stack. Comienza en la dirección de memoria más alta disponible para la aplicación, y crece hacia abajo. Aquí se guardan las direcciones de retorno de las llamadas a función, los parámetros pasados a las funciones y las variables locales de las funciones.

Cuando el heap está lleno (no se puede asignar la cantidad de memoria que se ha solicitado), se devuelve un puntero nulo. Esto no debe generar problemas si se comprueba la validez del puintero devuelto y se trata adecuadamente.

Los problemas con la pila suelen tener dos orígenes. Uno es el empleo excesivo de funciones recursivas (y las condiciones de salida no se alcanzan), y otro el empleo de variables locales que ocupen mucha memoria (por ejemplo, arrays muy grandes), o una combinación de ambas. El stack (que crece "hacia abajo") puede "chocar" con el heap (que crece "hacia arriba"). El resultado suele ser el cuelgue de la aplicación o, aún peor, el cuelgue del sistema completo (alguna vez he tenido que quitar el cable de corriente porque no respondía ni al botón de
apagado).

Espero que todo este rollo conteste a tu pregunta. Saludos,