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是否支持一个有效的指针(非空)。它可以代替与空指针的比较操作。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[5]智能指针boost::scoped_ptr

【1】boost::scoped_ptr简介 boost::scoped_ptr属于boost库,定义在namespace boost中,包含头文件#include 便可以使用。 一句话:一个作用域指...

boost库在工作(6)作用域智能指针scoped_ptr之五

通过前面智能指针的学习,应了解到std::auto_ptr的使用和局限性,从而引发boost库针对这些情况提供了更多的智能指针,其中scoped_ptr就是针对std::auto_ptr的而提供的。对...

Boost智能指针——scoped_ptr

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

boost库在工作(3)作用域智能指针scoped_ptr之二

智能指针的原理,其实就是利用C++的一个特性,当对象创建时,一定会调用构造函数;当对象离开作用域时,会自动调用析构函数。由于这两个函数的调用都是由编译器来生成的,不用怕不调用的危险,达到安全删除的目的...

Boost智能指针——scoped_ptr

Boost智能指针——scoped_ptr 转载自:http://www.cnblogs.com/TianFang/archive/2008/09/15/1291050.html bo...

Boost智能指针——scoped_ptr

boost智能指针——scoped_ptr boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码...

Boost智能指针——scoped_ptr

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

Boost智能指针——scoped_ptr

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

boost::scoped_ptr智能指针

scoped_ptr是boost库提供的很类似auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确地删除。在实现上都是利用了一个栈上的对象...

boost库在工作(2)作用域智能指针scoped_ptr之一

很久远以前,丹尼斯.里奇发明了C语言,这个语言有一个优点,就是可以动态地分配内存。当需要使用内存时,就可以立即向系统申请。当不需要时,又可以立即释放回给系统,再给别的程序使用。这种动态的内存管理,使得...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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