智能指针的使用

一、unique_ptr
unique_ptr的模板参数是类型T和deletor,但deletor可以是默认的,默认实现用的是delete或delete[]

  1. 初始化:
    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);

  2. 可以release, 然后reset接管新的对象

  3. 可以使用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可以;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值