默认的default_delete仅仅是调用了delete操作, 可以自定义deleter来决定析构时的操作
我们应该像传递raw指针一样传递智能指针, 不用去考虑引用, 右值引用之类的操作
编写的时候注意尽量不要抛出异常..., 赋值为nullptr
UniquePtr() noexcept :data(nullptr) {}
// 显式构造函数, 为了防止隐式类型转换
explicit UniquePtr(const..., 用weak代替
stl中通过让自己的类继承enable_shared_from_this类, 我们可以生成指向自身this的shared_ptr
这个问题是由于非侵入式访问的标准库设计哲学, shared_ptr...的计数器和对象本身是分离的, 如果在类中对this构造一个shared_ptr, 那么产生的是第二个计数器, 和初始化两次shared_ptr的效果是一样的, 并不是拷贝....因此在类中这个构造函数结束后, 这个对象(自己)就会被调用析构, 然后一切都boom了
enable_shared_from_this则通过weak_ptr安全地生成了一个自己的shared_ptr,