Middle
¿Cómo funciona unique_ptr en C++?
sobes.tech AI
Respuesta de la IA
std::unique_ptr — es un puntero inteligente que implementa la propiedad exclusiva de un objeto asignado dinámicamente. Proporciona gestión automática de memoria: el objeto al que apunta unique_ptr se elimina automáticamente al destruirse unique_ptr.
Características clave:
- Propiedad exclusiva: En cualquier momento, solo un
unique_ptrpuede poseer un objeto en particular. - Ausencia de copia:
unique_ptrno puede ser copiado. Esto previene la propiedad múltiple del mismo objeto y el problema de "doble eliminación". - Semántica de movimiento: La propiedad del objeto puede transferirse de un
unique_ptra otro usando la semántica de movimiento (std::move). - Deleter configurable: Se puede proporcionar un deleter propio para gestionar formas específicas de liberar recursos.
El principio de funcionamiento se basa en RAII (Resource Acquisition Is Initialization): el recurso (memoria asignada dinámicamente) se adquiere al crear el objeto (unique_ptr) y se libera al destruirse.
#include <memory> // Para unique_ptr
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass creado\n"; }
~MyClass() { std::cout << "MyClass destruido\n"; }
};
int main() {
{
// Creación de un unique_ptr que posee un objeto MyClass
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// En este momento, ptr1 es el propietario exclusivo del objeto
// auto ptr2 = ptr1; // Error de compilación: copia prohibida
// Transferencia de propiedad de ptr1 a ptr2
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Después del movimiento, ptr1 ya no posee el objeto (se vuelve nullptr)
if (!ptr1) {
std::cout << "ptr1 no posee objeto: " << (ptr1 ? "Sí" : "No") << "\n";
}
// La vida útil de ptr2 termina aquí.
// ptr2 se destruye, y el objeto MyClass que posee, se elimina automáticamente.
} // Aquí se destruye el objeto MyClass
std::cout << "Fin de main.\n";
return 0;
}
Comparación con raw pointer:
| Característica | raw pointer |
std::unique_ptr |
|---|---|---|
| Propiedad del recurso | No definido | Exclusiva |
| Eliminación automática | No | Sí |
| Semántica de copia | Sí | No (solo movimiento) |
| Riesgo de fugas de memoria | Alto | Bajo |
En general, unique_ptr es la forma preferida de gestionar memoria dinámica en C++11 y versiones superiores, especialmente cuando se requiere propiedad estricta y liberación automática de recursos.