boost智能指针小结
来源:互联网 发布:科学冷知识知乎 编辑:程序博客网 时间:2024/06/01 13:47
1.STL的指针auto_ptr当拷贝构造或者赋值时会发生控制权的转移,所以不能被当做元素存储到数组或者标准库的容器中去,当然也不能用指向数组的指针去初始化一个auto_pt对象。下面介绍几个此类的几个关键方法。
ap.reset(p); 如果p与ap的值不相同,则删除ap指向的对象并且将ap绑定到p。
ap.release(); 返回ap所保存的指针并且使ap成为未绑定的。
ap.get(); 返回ap所保存的指针。
2.boost::scoped_ptr/boost::scoped::array。
这两个只能指针不会存在所有权转移的问题,因为他们的拷贝构造函数和=操作符被声明为私有成员。。。重载了*和->操作符;还有一个reset()函数可以手动销毁指向的对象。
3.boost::shared_ptr/boost::shared_array。
该智能指针也重载了*和->操作符;
reset()也是用于显式手动销毁对象的函数;
use_count()用来检查当前指向所管理对象的shared_ptr的个数。
由于采用和引用计数机制来实现共享语意,所以可以存储到STL的容器中去,但是不可避免的出现了循环计数的问题。此问题用boost::weak_ptr来解决。boost::weak_ptr中存储的是指向一个已经由boost::shared_ptr所管理对象的弱引用,其中没有重载operator->。因此当需要访问该对象时,需要将boost::weak_ptr转换为boost::shared_ptr来进行。这种转换可以通过构造一个新的boost::shared_ptr或者调用boost::weak_ptr的lock()方法进行。如果此刻该对象已经不存在了,则这两种方法都将失败。lock()会返回空,而boost::shared_ptr的构造函数将会抛出boost::bad_weak_ptr异常。请看一个例子:
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace std;
void testptr()
{
boost::shared_ptr<simple> psimple(new simple);
boost::weak_ptr<simple> psimple2(psimple);
// psimple.reset();
if (psimple2.lock())
{
psimple2.lock()->foo();
}
else
{
cout<<"simple is gone"<<endl;
}
try
{
boost::shared_ptr<simple> psimple3(psimple2);
psimple3->foo();
}
catch(boost::bad_weak_ptr)
{
cout<<"simple has gone, can not construct shared_ptr"<<endl;
}
cout<<"exit sharedPtr()"<<endl;
}
int main()
{
testptr();
cout<<"exit main()"<<endl;
return 0;
}
当把psimple.reset()注释掉的时候,没有用该函数销毁对象,这个boost::weak_ptr是可以正常访问的该对象的。
若没注释掉,即会调用该函数来销毁对象,然后再使用boost::weak_ptr就会发生错误!!!
- boost智能指针小结
- Boost的智能指针
- 智能指针:boost学习
- Boost中的智能指针
- boost智能指针
- 【Boost】智能指针
- 使用Boost智能指针
- boost智能指针介绍
- Boost智能指针学习
- Boost智能指针:shared_ptr
- Boost智能指针小记
- Boost 中的智能指针
- boost:智能指针
- 使用Boost智能指针
- C++ Boost智能指针
- boost智能指针
- Boost之智能指针
- boost - 智能指针介绍
- adb remount 失败:remount failed: Operation not permitted
- Mat和IplImage和CvMat格式相互转换
- Boost::bimap
- Cairo 图形指南 (4) —— 基本绘图
- ubuntu10/12安装vmtools
- boost智能指针小结
- 兴业银行托管主代销国内首只互联网大数据基金
- java jsoup解析html实例
- 创建数据库表默认字段封装SQL
- Mdi窗体客户区无边框显示
- boost::regex
- VC++6.0不能显示MSDN解决办法
- Cairo 图形指南 (5) —— 形状与填充
- Linux(CentOS)终端类型及相互转换方式