一、unique_ptr
unique_ptr的模板参数是类型T和deletor,但deletor可以是默认的,默认实现用的是delete或delete[]
-
初始化:
a) auto p = std::make_unique(), C++14;
b) std::unique_ptr<D[]> p{new D[3]};
c) std::unique_ptr<D[]> p(new D[3]);
d) std::unique_ptr p; p.reset(new D); -
可以release, 然后reset接管新的对象
-
可以使用std::move(), 将左值转为右值,再赋值给另一个unique_ptr;
auto p = std::make_unique();
unique_ptr q = std::move§;//这时的p已经是空指针了
二、shared_ptr
1.初始化:
a) std::shared_ptr p = std::make_shared();
b) std::shared_ptr p(new Derived()); std::shared_ptr q§;
c) std::shared_ptr p(new Derived()); std::shared_ptr q = p;
2.make_shared VS shared_ptr p(new Derived()):
a) shared_pt需要两次在堆上分配空间, 一次为new Derived(),另一次为shared_ptr的强引用和弱引用计数器; 而 make_shared只需一次, 即可分配连续的空间。
b)异常安全
避免下面潜在的问题(把shared_ptr (new Widget)放在传参之前也可以避免)
c) 对于shared_ptr (new Widget), 当强引用计数器为0时,对象就会被释放掉,这时如果使用弱引用weak_ptr.lock(), 则会返回false; 而make_shared, 只有强引用和弱引用计数器均为0时, 对象才会和shared_ptr一起被释放掉
三、 weak_ptr
weak_ptr必须用shared_ptr初始化, 使用时必须用weak_ptr.lock()f返回的shared_ptr来操作
std::weak_ptr gw;
if (auto spt = gw.lock()) { // Has to be copied into a shared_ptr before usage
std::cout << *spt << “\n”;
}
四、auto_ptr
auto_ptr是C++11之前的废弃版,替代版是unique_ptr;
auto_ptr VS unique_ptr:
a) auto_ptr 可以拷贝和赋值,这样会转移裸指针的控制器,而unique_ptr不可以;
b) auto_ptr不可以放在容器里,但unique_ptr可以,通过std::move()的移动语义实现的;
c) auto_ptr不可以做返回值,而unique_ptr可以;