std::unique_ptr: Single owner, zero overhead
1auto p = std::make_unique<Widget>();2auto p2 = std::move(p); // p is null
std::shared_ptr: Shared ownership with ref counting
1auto p1 = std::make_shared<Widget>();2auto p2 = p1; // ref count = 2
std::weak_ptr: Non-owning reference (breaks cycles)
1std::weak_ptr<Widget> wp = sp;2if (auto locked = wp.lock()) { /* use */ }
When to use:
unique_ptr: default choice for ownershipshared_ptr: shared ownership, complex graphsweak_ptr: cache, observer, breaking cycles