Boost中的scoped_ptr(区域指针)

   scoped_ptr是boost.smart_ptr库中六种智能指针之一,它的名字可以直接告诉阅读者:这个智能指针只能在本作用域里使用,不希望被转让。scoped_ptr唯一的私有成员是T*的指针,故其构造函数只能接受一个类型为T*的指针p,可以在内部保存指针参数p。p必须是一个new表达式动态分配的结果,或是一个空指针(0)。scoped_ptr同时把拷贝构造函数和赋值操作符都声明为私有的,禁止对智能指针的复制操作,保证了被它管理的指针不能被转让所有权。scoped_ptr不允许拷贝、赋值,只能在scoped_ptr被声明的作用域内使用,而且不能对scoped_ptr进行++或者--等指针算数操作。使用scopen_ptr有两个好处:一是使代码变的清晰简单,而简单意味着更少的错误;而是它没有增加多余的操作,安全的同时保证了效率,可以获得与原始指针同样的速度。

   scoped_ptr与auto_ptr的区别:scoped_ptr与auto——ptr具有同样的缺陷,不能作为容器,但原因不同:auto_ptr是因为它的转移语义,而scoped_ptr则是不支持拷贝和赋值,不符合容器对元素类型的要求。它们两者根本的区别在指针的所有权。auto_ptr特意被设计为指针的所有权是可以转移的,可以在函数之间传递,同一时刻只能有一个auto_ptr管理指针。它的用意是好的,但转移语义太过与微妙,出学生很容易引发错误。而scoped_ptr吧拷贝构造函数和赋值函数都声明为私有的,拒绝了指针所有权的转让——————除了scoped_ptr自己,其他任何人都无权访问被管理的指针,从而保证了指针的绝对安全。

scoped_ptr的实现:

#include<iostream>
using namespace std;
template<typename T>
class scoped_ptr
{
private:
scoped_ptr(const scoped_ptr<T> &);
scoped_ptr<T>& operator =(const scoped_ptr<T> &);
void operator==(scoped_ptr const&) const;
void operator!=(scoped_ptr const&) const;
/*
以上四行,实现了区域指针的特点,不可以调用拷贝构造及赋值,同时对象间不能比较及取不等于
*/
public:
explicit scoped_ptr(T *p = 0):px(p){}
~scoped_ptr(){delete px;}
T& operator*() const{return *px;} //重载*运算符
T* operator->()const{return px;}//重载->
T* get()const{return px;}//获取当前px的地址
typedef scoped_ptr<T> this_type;
void reset(T *p = 0){this_type(p).swap(*this);}//重新指向,运用了临时对象暂时记录p,同时调用swap 函数完成交换,使之前指向的空间被释放
void swap(scoped_ptr &b)//交换函数,对px与b进行指向交换
{
T *tmp = b.px;
b.px = px;
px = tmp;
}
private:
T *px;
};
void fn()
{
int *a = new int(100);
scoped_ptr<int> q(a);
cout<<*q<<endl;
int *b = new int(30);
q.reset(b);
cout<<*q<<endl;
}
void main()
{
int *p = new int(10);
scoped_ptr<int> ps(p);
cout<<*ps<<endl;
int *q = new int(20);
ps.reset(q);
cout<<*ps<<endl;
fn();
}



参考:Boost程序库完全开发指南

猜你喜欢

转载自blog.csdn.net/zzb2019/article/details/79076358
今日推荐