《Effective Modern C++》学习笔记 - Chapter 4. 智能指针

  • 让我们列举一下为什么很难爱上一个裸指针(raw pointers)
  1. 其声明不能指示其指向的是一个单独对象还是数组。
  2. 其声明不能告诉你应否在使用完毕时销毁它,换言之你不知道它是不是(独占地)拥有着它指向的东西。
  3. 如果你决心销毁它,你没有办法知道如何做到——你是应该用 delete,还是有一套其它的销毁机制(或许是调用一个专门的函数)?
  4. 如果你确定 delete 是合适的方法,原因一告诉我们你无法确定应该用单个对象销毁的 delete 形式,还是数组销毁的 delete [] 形式。如果用错了,结果就是 undefined behaviour。
  5. 假设你的确搞清了它指向什么并且知道如何销毁,你还是很难保证销毁行为会在代码中任何可能的执行路径(包括异常)中都被执行 恰好一次 。遗漏了某个路径会导致资源泄漏,销毁多于一次则又是 undefined bahaviour。
  6. 通常没有办法判断一个指针是否是 悬空(dangle) 的,即它指向的内存是否已经不再存储它指向的对象。当物体已被销毁而指针仍指向它们时就会导致这种情况。
  • C++11的 智能指针(smart pointer) 可以解决这些问题。它们是裸指针的封装,行为尽可能与裸指针近似,但绕过了很多坑点。智能指针可以做裸指针能做的任何事情,并且犯错的几率远远小于它。因此你应该倾向于使用智能指针而非裸指针。
  • C++11中有四种智能指针:std::auto_ptr, std::unique_ptr, std::shared_ptrstd::weak_ptrstd::auto_ptr 是C++98的产物,现在已经被废弃(deprecated)。由于没有移动语义,其表现在一些方面很奇怪,使用上也有很多限制。std::unique_ptr 可以做前者的所有工作以及更多。除非只能用C++98编译器,任何时候都应该使用 std::unique_ptr

以下为各条款(Item)链接:

Item 18: 使用 std::unique_ptr 管理独占性资源
Item 19: 使用 std::shared_ptr 管理共享性资源
Item 20: 使用 std::weak_ptr 管理可能悬空的类似 std::shared_ptr 的指针
Item 21: 倾向于使用 std::make_unique 和 std::make_shared 而非直接使用 new
Item 22: 使用 Pimpl 手法时,在实现文件中定义特殊成员函数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值