C++11之智能指针(上)

缘起
        对于C/C++程序员而言,资源管理是从来都不可回避的一个话题,资源泄露也成了程序员挥之不去的噩梦,稍不小心就掉到坑里去了,为了解决这些问题,托管语言引入了GC机制,由于C++缺乏语言层面的GC机制,资源管理一直很棘手,也是被很多人诟病。为了管理资源,C++采用RAII手法(资源获取即初始化,Resource Acquisition Is Initialization),利用局部对象管理资源,在使用资源的类的构造函数中申请资源,然后使用,最后在析构函数中释放资源。如果对象是用声明的方式在栈上创建的局部对象,那么RAII机制会正常工作,当离开作用域时对象会自动销毁从而调用析构函数释放资源。
     对于动态内存的管理,C++通过类来封装和管理内存资源,就是我们所谓的智能指针,用于对象的生命周期管理,智能指针的用法和内建指针没有太大的区别,最重要的是它的效率并不弱于内建指针。C++98 只提供了唯一的严格的对象的所有权语义的智能指针auto_ptr,在C++ 11中被废弃了。C++11  引入了两个指针类: shared_ptr 和 unique_ptr。 shared_ptr只是单纯的引用计数指针,unique_ptr 是用来取代auto_ptr。 unique_ptr 提供 auto_ptr 大部份特性,唯一的例外是 auto_ptr 的不安全、隐性的左值搬移,自从auto_ptr存在以来,一直就争议不断,就是auto_ptr的破坏性复制语义,将一个auto_ptr复制给另一个之后,原来的auto_ptr就不指向任何东西,被重置为未绑定状态,出现所有权转移,因此,不能将auto_ptr对象存储在标准容器中,标准库的容器类要求在复制或赋值之后两个对象相等,auto_ptr并不满足这一要求。不像 auto_ptr,unique_ptr 可以存放在 C++11提出的那些能察觉搬移动作的容器之中。两者都兼容其它标准库组件,因此你可以在标准容器内安全保存这些智能指针,并使用标准算法操作它们。对于非内存资源的管理,如资源句柄,控制锁等等,在后面的文章会讲到。

    关于智能指针的缘起,并不是学院派的产物,而是实际编码开发的结果,由于异常安全的问题愈来愈突出,严重影响到标准库的设计,智能指针才进入了C++委员会的视野,最早提交的解决方案是两个智能指针类(资源独占的auto_ptr和进行引用计数的c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值