Smart pointers — automatic memory management via RAII.
Types:
1. std::unique_ptr:
1#include <memory>23std::unique_ptr<int> ptr1 = std::make_unique<int>(10);4std::cout << *ptr1; // 1056// Transfer ownership7std::unique_ptr<int> ptr2 = std::move(ptr1);8// ptr1 is now empty910// Array11auto arr = std::make_unique<int[]>(5);12arr[0] = 1;
2. std::shared_ptr:
1auto ptr1 = std::make_shared<int>(10);2{3 auto ptr2 = ptr1; // Share ownership4 std::cout << ptr1.use_count(); // 25}6std::cout << ptr1.use_count(); // 1
3. std::weak_ptr:
1std::shared_ptr<int> sptr = std::make_shared<int>(10);2std::weak_ptr<int> wptr = sptr;34if (auto locked = wptr.lock()) {5 std::cout << *locked; // 106}
Best practices:
make_unique/make_shared over new.unique_ptr by default.shared_ptr only when needed.weak_ptr unless breaking cycles.