Releasing ownership with `std::unique_ptr` and `std::shared_ptr`
Copying `std::unique_ptr` and `std::shared_ptr` objects
Cloning objects with `std::unique_ptr` and `std::shared_ptr`
Managing arrays with `std::unique_ptr` and `std::shared_ptr`
Dynamic memory allocation and smart pointers