0Pricing
C++ Academy · Lección

unique_ptr y propiedad exclusiva

Exprese una semántica de propietario único con unique_ptr y tipos que solo pueden moverse.

unique_ptr y propiedad exclusiva es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

El puntero inteligente de propietario único

std::unique_ptr<T> es propietario de un objeto en el heap. Cuando se destruye el unique_ptr, elimina el objeto. No se puede copiar, solo mover.

Crear un unique_ptr

Use std::make_unique (C++14): es seguro frente a excepciones y conciso.

#include <memory>
auto w = std::make_unique<Widget>();         // default-constructed
auto p = std::make_unique<Point>(3, 4);       // forwarded args

Usarlo como un puntero

unique_ptr admite las operaciones habituales de los punteros.

auto p = std::make_unique<Point>(3, 4);
std::cout << p->x;        // arrow access
std::cout << (*p).y;      // dereference
if (p) std::cout << "non-null";

No se puede copiar: sí se puede mover

Copiarlo implicaría tener dos propietarios, lo que incumple el significado de "unique". Moverlo transfiere la propiedad.

std::unique_ptr<int> a = std::make_unique<int>(1);
std::unique_ptr<int> b = std::move(a);
// a is now empty, b owns the int

Pasar a funciones

Por valor (con std::move): transfiere la propiedad. Por referencia: toma prestado el objeto sin adquirir su propiedad.

void consume(std::unique_ptr<Widget> w);   // takes ownership
void inspect(const Widget& w);              // borrows

auto w = std::make_unique<Widget>();
consume(std::move(w));
// w is now empty
inspect(*w);                                // (after re-creating)

Devolver desde funciones

Una función que reserva un objeto y devuelve su propiedad debería devolver un std::unique_ptr.

std::unique_ptr<Widget> create() {
    return std::make_unique<Widget>();
}

Restablecer y liberar

reset() elimina el objeto actual y, opcionalmente, adquiere la propiedad de uno nuevo. release() renuncia a la propiedad y devuelve el puntero sin procesar.

auto p = std::make_unique<int>(10);
p.reset(new int(20));    // delete the old, own the new
int* raw = p.release();   // p is now empty
delete raw;               // caller must delete

get(): tomar prestado el puntero sin procesar

get() devuelve el puntero sin procesar sin renunciar a la propiedad. Úselo para interoperabilidad sin adquirir la propiedad.

auto p = std::make_unique<int>(42);
legacy_api(p.get());      // p still owns it

unique_ptr para arrays

Para arrays, use unique_ptr<T[]>. Permite el acceso indexado con []; al destruirlo se llama a delete[].

auto arr = std::make_unique<int[]>(10);
arr[0] = 99;
std::cout << arr[0];

Eliminadores personalizados

Proporcione un eliminador personalizado como parámetro de plantilla cuando el recurso no sea memoria sin procesar, por ejemplo, identificadores de archivos o recursos del sistema operativo.

auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(std::fopen("a.txt","r"), closer);

Rendimiento

Con el eliminador predeterminado, unique_ptr tiene el mismo tamaño y velocidad que un puntero sin procesar: no tiene sobrecoste.

Comprobación rápida

¿Por qué std::unique_ptr prohíbe la copia?

Repaso

std::unique_ptr es el puntero inteligente predeterminado: no tiene sobrecoste, ofrece propiedad exclusiva y se puede mover, pero no copiar. Prefiera std::make_unique para construirlo.

Preguntas frecuentes

¿La lección «unique_ptr y propiedad exclusiva» es gratis?

Sí — el texto completo de «unique_ptr y propiedad exclusiva» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «unique_ptr y propiedad exclusiva»?

Exprese una semántica de propietario único con unique_ptr y tipos que solo pueden moverse. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «unique_ptr y propiedad exclusiva»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Por qué los punteros inteligentes sustituyen a new y delete sin formato
  2. unique_ptr y propiedad exclusiva
  3. shared_ptr y weak_ptr: propiedad compartida
  4. Eliminadores personalizados y funciones make
← Volver a C++ Academy