3 types: unique_ptr, shared_ptr, weak_ptr
shared ptr is thread safe…
non-owning pointer
useful when caching…
specify a functor to handle special things when deallocate object…
In shared_ptr, when need to share the lifetime of a subobject…
double managing the same object… solution: use make_shared(), make_unique() instead