shared_ptr — owns object. weak_ptr — observes without owning.
std::shared_ptr:
1auto sptr = std::make_shared<int>(10);2// Object stays alive while shared_ptr exists
std::weak_ptr:
1std::weak_ptr<int> wptr = sptr;23// Check if object still exists4if (auto locked = wptr.lock()) {5 // Object is alive, use *locked6} else {7 // Object was destroyed8}
Use case — breaking circular reference:
1class Node;23class Node {4public:5 std::shared_ptr<Node> next;6 std::weak_ptr<Node> prev; // weak to break cycle7};
Without weak_ptr: