关于boost 的smart_ptr 的使用问题
boost 的smart_ptr 库中含有好几种智能指针,大家用的最多的应该是shared_ptr ,为啥呢?好用,不用管他啥时候会自动删除等等,而且拷贝和复制都很到位, 但实际上,这个库也有问题,连城写过一片文章,详细介绍了boost::shared_ptr库的四宗罪,不过我觉得有的问题,实际上不能怪shared_ptr,甚至boost 也给出了响应的解决方案,虽然不是完美,但也甚觉不错。 boost库中除了 shared_ptr ,还提供了 scoped_ptr, weak_ptr 两种智能指针,下面详细介绍这三种智能指针的用法以及弊端
scoped_ptr 是一个 有严格所有权的智能指针,其所有权不能转让,一旦申明一个scoped_ptr ,他就会一直拥有该对象,直到该对象失去作用自动释放。scoped_ptr 的几个重要函数原型是:template<class T>class scoped_ptr {private: T *px; scoped_ptr (scoped_ptr const & copy); scoped_ptr & operator = (scoped_ptr const & copy);public: explict scoped_ptr (T *p = 0); ~scoped_ptr();
void reset(T *p = 0); T & operator * () const; T * operator -> () const; T * get () const; operator unspecified_bool_type() const; void swap(scoped_ptr & b); }
通过上述几个函数,我们就能一窥 scoped_ptr 所有权不能变更的原因了。第一:将scoped_ptr 的拷贝构造函数申明为私有的,这样外部如要调用,在编译时就已经产生违规现象了。第二:将scoped_ptr 的 赋值操作符 = 申明为私有的,也就使得像 scoped_ptr< > ptr1 = scoped_ptr <> ptr2 这种用法失去了效果,在编译时就会产生违规现象了。从而使得其所有权永远牢固的掌握在scoped_ptr 最初的那个对象手中,防止了无故的滥用
从以上说明,我们可以看出,scoped_ptr 对象不能用于函数调用中,不能存放在容器中。其存放的对象,除非其主动放弃所有权(swap函数调用),不然始终是由其保管的。
从以上信息可以看出,scoped_ptr 主要用于所有权清晰,从始至终都是由一个对象保管,不会用于参数传递的对象上,一旦所有权转让了,也就失去了作为scoped_ptr 的作用了。
weak_ptr 一般来说,他是为配合shared_ptr 而引入的一种智能指针,它更像是一个助手而不是一个指针。因为其没有重载 * 和 -> 这两个最重要的 操作符,使得其有点“不像” 指针。所以,他是一个“弱”指针,他不能共享指针,不能操作资源。 但这个weak_ptr 却有另外一个用处,首先看一下他的定义template<class T>class weak_ptr{private: public: weak_ptr(); template <class Y> weak_ptr(share_ptr <Y> const &r); weak_ptr (weak_ptr const &); ~weak_ptr();
weak_ptr & operator =(weak_ptr const &r);
long use_count() const;
bool expired() const; shared_ptr<T> lock() const;
void reset(); void swap(weak_ptr <T> &b);};
从上面的几个接口可以看出,weak_ptr 却是是很弱的。很多东西都不提供,功能非常有限.但实际上,weak_ptr 还是有很多用处的。1、他可以使用一个非常重要的成员函数lock 从被探测的sheard_ptr 获取一个可用的shared_ptr 对象,从而操作资源(注意,如果expired() == true 则会返回一存储空指针的shared_ptr );2、他可以用来返回 this 指针:一个指向 shared_ptr 的含有自身对象的指针。如果这时候直接使用shared_ptr 容易导致很严重的循环引用,用weak_ptr 就能较好的实现避免循环引用。 但注意,如果一个非new 的对象,却是不能这么用的,不然在释放的时候会导致很严重的错误:释放一个栈上的对象,从而发生未定义的错误。
http://hi.baidu.com/anexx/item/3e7d7ad5d402e81620e250cb
关于boost 的smart_ptr 的使用问题的更多相关文章
- 初探boost之smart_ptr库学习笔记
概述 Boost.smart_ptr库提供了六种智能指针,除了shared_ptr 和 weak_ptr 以外还包含 scoped_ptr .scoped_array . shared_array . ...
- boost库的安装,使用,介绍,库分类
1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...
- boost之内存管理
内存管理一直是令C++程序员最头疼的工作,C++继承了C那高效而又灵活的指针,使用起来稍微不小心就会导致内存泄露.野指针.越界访问等访问.虽然C++标准提供了只能指针std::auto_ptr,但是并 ...
- Linux 内核里的“智能指针”【转】
转自:http://blog.jobbole.com/88279/ 众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异 ...
- Smart pointer 智能指针小总结
Smart pointer line 58之后smart pointer里的计数已经是0,所以会真正释放它引用的对象,调用被引用对象的析构函数.如果继续用指针访问,会出现如下图的内存访问异常.所以说如 ...
- Boost使用笔记(Smart_ptr)
我是Word写的,复制过来实在懒得在排版了,有兴趣的朋友可以去我的百度文库看,谢谢 http://wenku.baidu.com/view/34e485e2f61fb7360b4c653e.html ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- Boost 安装
1.下载boost Windows版,如:boost_1_55_0: 2.运行boostrap.bat,会生成bjam.exe: 3.运行bjam.exe(时间会比较长),会生成一个stage目录里面 ...
- Boost.log
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
随机推荐
- 【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行
题目描述 Miranda 生活的城市有 \(N\) 个小镇,一开始小镇间没有任何道路连接.随着经济发现,小镇之间陆续建起了一些双向的道路但是由于经济不太发达,在建设过程中,会保证对于任意两个小镇,最多 ...
- 【JQuery】遍历
一.前言 接着上一章的内容,继续本章的学习. 二.内容 .add 将元素添加到匹配元素的集合中 .add(object) .add(selector,context) .addSelf ...
- CF487E Tourists 【圆方树 + 树剖 + 堆】
题目链接 CF487E 题解 圆方树 + 树剖 裸题 建好圆方树维护路径上最小值即可 方点的值为其儿子的最小值,这个用堆维护 为什么只维护儿子?因为这样修改点的时候就只需要修改其父亲的堆 这样充分利用 ...
- apue3.e (基于maxos 10.9)
在Google搜到你的问题,我也碰到同样的问题(5分钟前),然后通过其他的搜索结果找到答案,不知道你是否跟我一样,出现以下的错误: ... clang: error: unknown argument ...
- bzoj5118: Fib数列2(费马小定理+矩阵快速幂)
题目大意:求$fib(2^n)$ 就是求fib矩阵的(2^n)次方%p,p是质数,根据费马小定理有 注意因为模数比较大会爆LL,得写快速乘法... #include<bits/stdc++.h& ...
- 很好的c++和Python混合编程文章
c++中嵌入python入门1 本人是用vc2003+python2.5学习的,其它的也应该差不了多少 0. 坏境设置把Python的include/libs目录分别加到vc的include/lib ...
- 使用uiautomator时遇到问题的处理方法
本帖持续更新中… 一.使用adb devices无法连接到模拟器 这种情况可能是因为服务挂了之类的原因,重启一下服务 adb kill-server //关闭adb服务 adb start-serve ...
- [DeeplearningAI笔记]序列模型2.6Word2Vec/Skip-grams/hierarchical softmax classifier 分级softmax 分类器
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.6 Word2Vec Word2Vec相对于原先介绍的词嵌入的方法来说更加的简单快速. Mikolov T, Chen ...
- Thinkphp关联模型使用
1.需求描述 首页文章列表,需要同时获取文章的点赞和被关注数,同时如果被当前用户点赞或关注了会显示相应小图标进行区别.图示如下: 2.解决方案 数据库设计: 文章对应Article表,其中包括收藏数字 ...
- HDU 1402 FFT 大数乘法
$A * B$ FFT模板题,找到了一个看起来很清爽的模板 /** @Date : 2017-09-19 22:12:08 * @FileName: HDU 1402 FFT 大整数乘法.cpp * ...