Junior
224
¿Qué punteros inteligentes existen en C++?
Respuesta de la IA
sobes.tech AI
std::unique_ptr, std::shared_ptr, std::weak_ptr.
-
std::unique_ptr:- Propiedad exclusiva del objeto.
- No puede ser copiado, pero puede ser movido (
std::move). - Elimina automáticamente el objeto al salir del ámbito o destruirse
unique_ptr. - Es liviano, sin costos adicionales en el contador de referencias.
#include <memory> // Creación de unique_ptr std::unique_ptr<int> up1(new int(10)); // Movimiento de propiedad std::unique_ptr<int> up2 = std::move(up1); // up1 ahora es nullptr // up2 posee el objeto -
std::shared_ptr:- Propiedad compartida del objeto.
- Usa un contador de referencias para rastrear cuántos
shared_ptrapuntan al recurso. - El objeto se elimina cuando el último
shared_ptrque lo apunta se destruye. - Se puede copiar y mover.
- Tiene costos adicionales en el contador de referencias (generalmente asignado por separado).
- Puede formar referencias cíclicas, lo que lleva a fugas de memoria.
#include <memory> // Creación de shared_ptr std::shared_ptr<int> sp1 = std::make_shared<int>(20); // Copiar propiedad std::shared_ptr<int> sp2 = sp1; // El contador de referencias aumenta // sp1 y sp2 poseen el objeto -
std::weak_ptr:- No posee el objeto.
- Representa una "referencia débil" al objeto, gestionado por uno o varios
shared_ptr. - Se usa para prevenir referencias cíclicas entre
shared_ptr. - No incrementa el contador de referencias del objeto.
- Para acceder de forma segura al objeto, se convierte en
shared_ptrusando el métodolock(). Si el objeto ya fue eliminado,lock()devolverá unshared_ptrvacío.
#include <memory> // Creación de shared_ptr std::shared_ptr<int> sp = std::make_shared<int>(30); // Creación de weak_ptr desde shared_ptr std::weak_ptr<int> wp = sp; // Verificación y uso del objeto if (auto shared_from_weak = wp.lock()) { // Acceso al objeto a través de shared_from_weak } else { // El objeto ya fue eliminado }