Patrones de Gestión de Memoria
Descripción General de las Estrategias de Gestión de Memoria
Los patrones de gestión de memoria ayudan a los desarrolladores a manejar eficientemente la asignación dinámica de memoria y a prevenir problemas comunes relacionados con la memoria.
RAII (Resource Acquisition Is Initialization)
class ResourceManager {
private:
int* data;
public:
ResourceManager(size_t size) {
data = new int[size];
}
~ResourceManager() {
delete[] data;
}
};
Patrones de Punteros Inteligentes
graph TD
A[Punteros Inteligentes] --> B[std::unique_ptr]
A --> C[std::shared_ptr]
A --> D[std::weak_ptr]
Patrón de Puntero Único
std::unique_ptr<int> createUniqueResource() {
return std::make_unique<int>(42);
}
Patrón de Puntero Compartido
std::shared_ptr<int> sharedResource = std::make_shared<int>(100);
auto anotherReference = sharedResource;
Estrategias de Gestión de Memoria
| Estrategia |
Descripción |
Caso de Uso |
| Transferencia de Propiedad |
Semántica de movimiento |
Gestión eficiente de recursos |
| Conteo de Referencias |
Propiedad compartida |
Ciclos de vida de objetos complejos |
| Referencias Débiles |
Referencias no propietarias |
Romper dependencias circulares |
Patrón de Eliminador Personalizado
auto customDeleter = [](int* ptr) {
std::cout << "Eliminación personalizada" << std::endl;
delete ptr;
};
std::unique_ptr<int, decltype(customDeleter)>
customPtr(new int(50), customDeleter);
Patrón de Piscina de Memoria
class MemoryPool {
private:
std::vector<int*> pool;
public:
int* allocate() {
if (pool.empty()) {
return new int;
}
int* mem = pool.back();
pool.pop_back();
return mem;
}
void deallocate(int* ptr) {
pool.push_back(ptr);
}
};
Gestión de Memoria Singleton
class Singleton {
private:
static std::unique_ptr<Singleton> instance;
Singleton() = default;
public:
static Singleton& getInstance() {
if (!instance) {
instance = std::unique_ptr<Singleton>(new Singleton());
}
return *instance;
}
};
Técnicas Avanzadas de Gestión de Memoria
Placement New
char buffer[sizeof(MyClass)];
MyClass* obj = new (buffer) MyClass();
// Colocación de memoria personalizada
Antipatrones de Gestión de Memoria
- Evitar la manipulación de punteros sin procesar.
- Minimizar la gestión manual de memoria.
- Preferir los punteros inteligentes de la biblioteca estándar.
- Usar la semántica de movimiento para mayor eficiencia.
Recomendación de LabEx
En LabEx, destacamos las técnicas modernas de gestión de memoria de C++ que priorizan la seguridad y el rendimiento.
Estrategias de Prevención de Errores
template<typename T>
class SafePointer {
private:
T* ptr;
public:
SafePointer(T* p) : ptr(p) {
if (!ptr) throw std::runtime_error("Puntero nulo");
}
~SafePointer() { delete ptr; }
};
Conclusión
Una gestión eficaz de la memoria requiere comprender los patrones, utilizar las características modernas de C++ y adoptar las mejores prácticas para crear software robusto y eficiente.