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 argsUsarlo 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 intPasar 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 deleteget(): 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 itunique_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
- Por qué los punteros inteligentes sustituyen a new y delete sin formato
- unique_ptr y propiedad exclusiva
- shared_ptr y weak_ptr: propiedad compartida
- Eliminadores personalizados y funciones make