Gestión de Memoria
Estrategias de Asignación de Memoria
Asignación en la Pila
void asignacionPila() {
char bufferLocal[50]; // Gestión automática de memoria
strcpy(bufferLocal, "Ejemplo de LabEx");
}
Asignación en el Montón
void asignacionMonton() {
char* bufferDinamico = new char[100];
strcpy(bufferDinamico, "Asignación Dinámica de Memoria");
delete[] bufferDinamico; // Limpieza crítica de la memoria
}
Comparación de la Gestión de Memoria
| Tipo de Asignación |
Duración |
Flexibilidad |
Rendimiento |
| Pila |
Automática |
Limitada |
Rápido |
| Montón |
Manual |
Flexible |
Más lento |
Técnicas de Seguridad de Memoria
1. Comprobación de Límites
void copiaSegura(char* destino, const char* origen, size_t tamañoDestino) {
strncpy(destino, origen, tamañoDestino - 1);
destino[tamañoDestino - 1] = '\0';
}
Ciclo de Vida de la Memoria
stateDiagram-v2
[*] --> Asignación
Asignación --> Inicialización
Inicialización --> Uso
Uso --> Desasignación
Desasignación --> [*]
Riesgos Comunes de Memoria
- Desbordamiento de búfer
- Fugas de memoria
- Punteros colgantes
- Memoria no inicializada
Gestión Avanzada de Memoria
Enfoque de Punteros Inteligentes
#include <memory>
void gestionMemoriaInteligente() {
std::unique_ptr<char[]> buffer(new char[100]);
strcpy(buffer.get(), "Gestión Automática de Memoria");
}
Estrategias de Optimización de Memoria
flowchart TD
A[Optimización de Memoria]
A --> B[Minimizar Asignaciones]
A --> C[Usar la Pila Cuando Sea Posible]
A --> D[Utilizar Punteros Inteligentes]
A --> E[Evitar Copias Innecesarias]
Consideraciones de Rendimiento
- Preferir la asignación en la pila para búferes pequeños.
- Utilizar la asignación dinámica para datos de tamaño variable.
- Liberar siempre la memoria asignada dinámicamente.
- Considerar el uso de contenedores de la biblioteca estándar.
Manejo de Errores
void manejoMemoriaRobusto() {
try {
char* buffer = new char[TAMANO_BUFFER_GRANDE];
// Operaciones de memoria
delete[] buffer;
} catch (std::bad_alloc& e) {
std::cerr << "Error en la asignación de memoria" << std::endl;
}
}
Buenas Prácticas
- Usar los principios RAII.
- Aprovechar las técnicas modernas de gestión de memoria de C++.
- Preferir los contenedores de la biblioteca estándar.
- Implementar comprobaciones de límites cuidadosas.