← SEARCHABLE ARCHIVE
C / C++ · 2026-06-23

C++ de los fundamentos al dominio — Lección 9

Expresar propiedad con punteros inteligentes

INTERACTIVE READING MODE →

Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.

El uso de punteros no causa problemas. El problema surge cuando se utilizan punteros sin formato como propiedad sin saber quién debe destruir el objeto.

Los punteros inteligentes expresan la propiedad como un tipo.

unique_ptr

std::unique_ptrtiene propiedad exclusiva.

#include <memory>

auto warrior = std::make_unique<Warrior>("Rose");
std::cout << warrior->Attack() << '\n';

Sin llamar nuevo directamentestd::make_uniqueCrea un objeto con Si Unique_ptr sale del alcance, el objeto propietario se destruye automáticamente.

Como es de propiedad exclusiva, no se puede copiar, pero sí se puede mover.

std::vector<std::unique_ptr<Character>> party;

auto warrior = std::make_unique<Warrior>("Rose");
party.push_back(std::move(warrior));

std::moveLuego, el guerrero queda vacío y la propiedad pasa al vector. std::move sirve para tratarlo como un valor móvil en lugar de una función para mover objetos.

shared_ptr

Es posible que un solo monstruo deba pertenecer tanto a la lista activa como al sistema de combate. En este momentostd::shared_ptrse puede utilizar.

auto monster = std::make_shared<Monster>(1, "Slime", 30);

std::vector<std::shared_ptr<Monster>> activeMonsters;
std::queue<std::shared_ptr<Monster>> spawnQueue;

spawnQueue.push(monster);
activeMonsters.push_back(monster);

Cuando se copia share_ptr, el objeto no se copia, pero se incrementa su recuento de referencias. El objeto real se destruye cuando desaparece su último propietario.

No es una buena idea convertir todos los punteros en Shared_ptr solo por conveniencia. No queda claro quién es el propietario, pueden aparecer referencias circulares y existen costos de gestión del recuento de referencias.

weak_ptr

Si no posee un objeto como el objetivo actual y solo desea observarlo,std::weak_ptrUsar .

std::weak_ptr<Monster> currentTarget;

currentTarget = monster;

if (auto target = currentTarget.lock())
{
    std::cout << target->GetHealth() << '\n';
}

débilptr no extiende la vida útil de un objeto. Si el objetivo está vivolock()Devuelve este ptrcompartido o, si ya ha sido destruido, devuelve un ptr_compartido vacío.

En resumen, si sólo hay un propietario, Uniqueptr, Si varios sistemas realmente necesitan poseer Sharedptr, Si solo lo ve sin poseerlo, es débil_ptr.

Cuando la propiedad se revela en el código, hay menos tiempo para preocuparse sobre cuándo eliminarlo.