There are three standard smart pointers which are included in the <memory> header:
std::unique_ptr: Enforces unique ownership and frees the resource automatically when it goes out of scope.
std::shared_ptr: Enables shared ownership and reference counting, releasing the resource only when the last pointer goes out of scope.
std::weak_ptr: Offers a non-owning reference to a shared pointer, useful for cyclic dependencies or situations where holding a strong reference would cause unwanted lifetime extension.