02 18 20 STACK HEAP PUNTEROS - MatRJ08/Portafolio_DatosII GitHub Wiki
Se ve porque se comenta gestión de memoria en el curso
Gestión de memoria a nivel de programación
Como es estructurada la memoria de un programa?
Todo programa en ejecución tiene que tener bien definido la estructura de su memoria
Linea de comandos
Stack
heap
unitialized data
initialized data
código
Stack
Sección de la memoria que se comporta como LIFO
- Compuesto por stack frames, que son llamadas de función, estos se insertan al LIFO
- Cuando la función retorna, el stack frame se remueve
- Todo Stack Frame posee como mínimo los siguientes componentes
- Linea a la que debe retornar
- Parámetros de la función llamada
- Variables Automáticas del método
- Para los parámetros y las variables creadas (por medio de los parámetros) se debe reservar espacio de memoria
- El stack maneja la memoria automáticamente, el programador no debe gestionarla
- En el stack el tamaño de las variables, deben estar bien definidas
- Con el Stack se interactúa indirectamente, mediante los llamados a funciones
Heap:
- El programador interactúa directamente con el heap, es decir, reserva, libera y aumenta o disminuye espacios reservados de memoria
- Operaciones para interactuar con el heap
- malloc
- calloc
- realloc
- al pedir mas memoria lo mas probable que se tenga que relocalizar esta misma
- free
- Si no se hace un free de una variable (memory leak), ese espacio no se libera hasta cerrar el programa (Progra 2017)
- Al pedir mas o nueva memoria en una memoria fragmentada, se necesita compactar la memoria
- Es un proceso caro
Cuando usar cada uno
- Heap: bloques grandes de memoria
- Structs
- Arreglos muy largos
- Estructuras de memoria dinámica
- Listas
- Grafos
- Stack:
- variables de tamaño conocido, que no crecen dinámicamente
- variables de scope pequeño
Punteros
- Variables que almacenan direcciones de memoria donde se encuentra un dato
- Su peso en memoria es equivalente a un int, independientemente del lenguaje
- Se le declara el tipo para
- Chequeo de errores
- Saber cuantos bytes debe de ir a leer
- Para asignar un valor se usa el andperson &
- Para obtener el valor se usa el asterisco *