设为首页 加入收藏

TOP

C++11中的智能指针
2015-11-10 13:46:03 来源: 作者: 【 】 浏览:7
Tags:智能 指针

C++11中,引入了智能指针。主要有:unique_ptr, shared_ptr, weak_ptr。
这3种指针组件就是采用了boost里的智能指针方案。很多有用过boost智能指针的朋友,很容易地就能发现它们之间的关间:


C++11将boost里的这一套纳入了标准。


如下为示例代码:


[1]: unique_ptr 是禁止复制赋值的,始终保持一个 unique_ptr 管理一个对象。
[2]: unique_ptr 虽然不能赋值,但可以通过 move() 函数转移对象的所有权。一旦被 move() 了,原来的 up1 则不再有效了。
[3]: reset() 可以让 unique_ptr 提前释放指针。
[4]: 由 shared_ptr 构造一个 weak_ptr


如下面的示例:


在内存中:


s1, s2, w1 都指向一个 ptr_manage 的对象。
在该对象中有 shared_ref_countweak_ref_count 两个域分别记录引用它的 shared_ptrweak_ptr 的个数。这个很容易办到,只要在复制构造与赋值函数中对相当地引用值进行加1,在析构中减1即可。ptr_manage 中的 ptr 域存放真正的对象指针地址。


shared_ref_cnt 被减为0时,自动释放 ptr 指针所指向的对象。当 shared_ref_cntweak_ref_cnt 都变成0时,才释放 ptr_manage 对象。
如此以来,只要有相关联的 shared_ptr 存在,对象就存在。weak_ptr 不影响对象的生命周期。当用 weak_ptr 访问对象时,对象有可能已被释放了,要先 lock()


当执行:


此时:

shared_ref_cnt 由2减成了1。


再执行:


此时:

shared_ref_cnt 已被减到0了,ptr 所对应的object已被释放,ptr 被清0。此时,ptr_manage 依旧保留。因为 w1 还需要引用它。


在最后,w1 也析构了的时候:

ptr_manage 中的 weak_ref_cnt 被减成0,最后连 ptr_manage 都释放了。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下运行C++程序出现“段错误(.. 下一篇PHP 性能分析与实验:性能的微观..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: