Smart pointers are class templates that own a heap object and free it automatically when they go out of scope. You get lifetime handling without ever writing delete.
unique_ptr models sole ownership. Exactly one owns the object, it cannot be copied, only moved, and it is as small and fast as a raw pointer. That makes it the default choice.
shared_ptr models shared ownership through a reference count. The object dies when the last owner does. It costs an extra control block and atomic count updates, so reach for it only when ownership has no single home.
weak_ptr owns nothing. It observes an object held by shared_ptr and tells you whether that object is still alive. You call lock() to get a usable shared_ptr, or nothing if it is gone.
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.
Why there's no diagram: “”
The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓
The diagram below the answer is the concept . Jump to it ↓