Sobes.tech
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_ptr puede poseer un objeto en particular.
  • Ausencia de copia: unique_ptr no 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_ptr a 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
Semántica de copia 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.