boost智能指针系列:scoped_ptr

原创 2013年12月05日 10:35:47

boost.smart_ptr库提供六种智能指针,分别为shared_ptr、weak_ptr、scoped_ptr、scoped_array、shared_array和instrusive_ptr。它们都是很轻量级的对象,速度与原始指针相差无几,都是异常安全的(exception safe),要求:类型T的析构函数不能抛出异常。

这些智能指针都位于名字空间boost,为了使用smart_ptr组件,需要包含头文件<boost/smart_ptr.hpp>,即:
#include <boost/smart_ptr.hpp>
using namespace boost;

scoped_ptr与auto_ptr相比,所有权更加严格,不能转让,一旦scoped_ptr获取了对象的管理权,就无法再从它那里取回来。

scoped_ptr的构造函数接受一个类型为T*的指针p,创建出一个scoped_ptr对象,并在内部保存指针参数p。p必须是一个new表达式动态分配的结果,或者是个空指针。当scoped_ptr对象的生命期结束时,析构函数~scoped_ptr()会使用delete操作符自动销毁所保存的指针对象,从而正确地回收资源。

scoped_ptr同时把拷贝构造函数和赋值操作符都声明为私有的,禁止对智能指针的复制操作,保证了被它管理的指针不能被转让所有权。

scoped_ptr示例代码:

#include <boost/smart_ptr.hpp>
#include <iostream>
using namespace boost;
using namespace std;

struct posix_file
{
	posix_file(const char * file_name)
	{
		cout << "open file:" << file_name << endl;
	}
	~posix_file()
	{
		cout << "close file" << endl;
	}
};

int main()
{
	scoped_ptr<posix_file> p(new posix_file("/tmp/a.txt"));
	return 0;
}

scoped_ptr与auto_ptr的根本性区别在于指针的所有权。auto_ptr特意被设计为指针的所有权是可转移的,可以在函数之间传递,同一时刻只能有一个auto_ptr管理指针。而scoped_ptr把拷贝构造函数和赋值函数都声明为私有的,拒绝了指针所有权的转让——除了scoped_ptr自己,其他任何人都无权访问被管理的指针,从而保证了指针的绝对安全。
auto_ptr<int> ap(new int(10));
scoped_ptr<int> sp(ap);//ok
auto_ptr<int> ap2;
ap2=ap;//ok
scoped_ptr<int> sp2;
sp2=sp;//not ok!编译报错!

scoped_ptr不支持比较操作,不能在两个scoped_ptr之间,或者在scoped_ptr和原始指针或空指针之间进行相等或者不相等测试,我们也无法为它编写额外的比较函数,因为它已经将operator == 和operator !=两个操作符重载都声明为私有的。但scoped_ptr提供了一个可以在bool语境中自动转换为bool值(如if的条件表达式)的功能,用来测试scoped_ptr是否支持一个有效的指针(非空)。它可以代替与空指针的比较操作。

Boost智能指针——scoped_ptr

 Boost智能指针——scoped_ptr boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码...
  • xuhao_xuhao
  • xuhao_xuhao
  • 2014年12月21日 22:41
  • 212

从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)

一、boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源。关于RAII的讨论可以参考前面的文 章。在...
  • Simba888888
  • Simba888888
  • 2013年07月29日 17:15
  • 12308

Boost智能指针——scoped_ptr

boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用: #in...
  • huangshanchun
  • huangshanchun
  • 2015年07月17日 21:35
  • 486

Boost智能指针——scoped_ptr

boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用:#include #include...
  • u012260238
  • u012260238
  • 2017年11月15日 20:12
  • 47

Boost智能指针——scoped_ptr

boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用: #...
  • acs713
  • acs713
  • 2014年06月07日 10:06
  • 686

浅谈BOOST库里面的智能指针

大家都知道,学习C语言,指针很很重要的一部分,那么为什么在C11中还会出现智能指针的概念呢,我们都知道C11是将以前C99的知识进行了更加深入的改变,让C用起来更加的方便,而且它还创建了许多新的类型,...
  • km_1314107
  • km_1314107
  • 2017年07月19日 10:31
  • 306

Boost智能指针——scoped_ptr

boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用: #in...
  • SUKHOI27SMK
  • SUKHOI27SMK
  • 2014年05月13日 10:36
  • 437

关于boost智能指针使用的一些坑的总结

boost库的智能指针确实是一个好东西,可以方便我们进行内存管理,避免因为忘记调用delete而导致的内存泄漏。然而boost库的只能指针却并非一定那么智能,在使用boost库智能指针的时候有一些坑,...
  • tgxallen
  • tgxallen
  • 2017年04月09日 15:30
  • 1691

Boost智能指针:scoped_ptr

Boost智能指针——scoped_ptr boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示...
  • xie1xiao1jun
  • xie1xiao1jun
  • 2014年11月25日 14:26
  • 509

Boost智能指针——scoped_ptr

Boost智能指针——scoped_ptr 转载自:http://www.cnblogs.com/TianFang/archive/2008/09/15/1291050.html bo...
  • hyl999
  • hyl999
  • 2017年07月06日 21:24
  • 118
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:boost智能指针系列:scoped_ptr
举报原因:
原因补充:

(最多只允许输入30个字)