Control de Memoria Dinámica
Funciones Básicas de Asignación de Memoria
Función malloc()
Reserva un número especificado de bytes en la memoria dinámica (heap) sin inicializarlos.
void* malloc(size_t size);
Función calloc()
Reserva memoria e inicializa todos los bytes a cero.
void* calloc(size_t num_elements, size_t element_size);
Función realloc()
Redimensiona un bloque de memoria previamente asignado.
void* realloc(void* ptr, size_t new_size);
Flujo de Trabajo de Asignación de Memoria
graph TD
A[Asignar Memoria] --> B{¿Asignación Exitosa?}
B -->|Sí| C[Usar Memoria]
B -->|No| D[Gestionar Error]
C --> E[Liberar Memoria]
Ejemplo Práctico de Gestión de Memoria
#include <stdio.h>
#include <stdlib.h>
int main() {
// Asignación dinámica de un array
int *dynamic_array = NULL;
int size = 5;
// Asignar memoria
dynamic_array = (int*) malloc(size * sizeof(int));
if (dynamic_array == NULL) {
printf("Error en la asignación de memoria\n");
return 1;
}
// Inicializar el array
for (int i = 0; i < size; i++) {
dynamic_array[i] = i * 10;
}
// Redimensionar el array
dynamic_array = realloc(dynamic_array, 10 * sizeof(int));
if (dynamic_array == NULL) {
printf("Error en la reasignación de memoria\n");
return 1;
}
// Liberar memoria
free(dynamic_array);
return 0;
}
Estrategias de Asignación de Memoria
| Estrategia |
Descripción |
Caso de Uso |
| Asignación Ansiosa |
Reservar toda la memoria necesaria al principio |
Estructuras de tamaño fijo |
| Asignación Perezoza |
Reservar memoria según sea necesario |
Estructuras de datos dinámicas |
| Asignación Incremental |
Aumentar gradualmente la memoria |
Colecciones crecientes |
Técnicas Comunes de Control de Memoria
1. Comprobaciones de Punteros Nulos
Siempre verifique el éxito de la asignación de memoria.
2. Seguimiento de Límites de Memoria
Mantener un registro del tamaño de la memoria asignada.
3. Evitar Liberaciones Dobles
Nunca libere el mismo puntero dos veces.
4. Establecer Punteros a NULL
Después de liberar, establezca los punteros a NULL.
Gestión Avanzada de Memoria
Pools de Memoria
Preasignar un gran bloque de memoria y gestionar sub-asignaciones.
Asignadores Personalizados
Implementar gestión de memoria específica de la aplicación.
Posibles Errores
- Fugas de memoria
- Punteros colgantes
- Desbordamientos de búfer
- Fragmentación
Herramientas de Depuración
- Valgrind
- AddressSanitizer
- Perfiles de memoria
Conclusión
Un control efectivo de la memoria dinámica requiere una planificación cuidadosa y prácticas consistentes. LabEx recomienda el aprendizaje continuo y la práctica para dominar estas técnicas.