Using `std::shared_ptr` with custom deleter functions
Using `std::unique_ptr` with custom deleter functions
Casting between smart pointers with `std::unique_ptr` and `std::shared_ptr`
Accessing underlying raw pointer with `std::unique_ptr` and `std::shared_ptr`
Memory leaks and smart pointers