C++ boost scoped_ptr

来源:互联网 发布:谷歌搜索算法 编辑:程序博客网 时间:2024/05/29 13:12

scoped_ptr摘要如下:

template<class T>

class scoped_ptr{

private:

T* px;                                                                          //原始指针

scoped_ptr(scoped_ptr const &);                      //拷贝构造函数私有化

scoped_ptr & operator=(scoped_ptr const &); //=运算符重载私有化

void operator==(scoped_ptr const&) const; //==运算符重载

void operator!=(scoped_ptr const&) const; //!=运算符重载

public:

explicit scoped_ptr(T* p = 0); //显式构造函数

~scoped_ptr();

void reset(T* p = 0); //重置智能指针

T& operator*() const; //*操作符重载

T* operator->() const;

T* get() const; //获得原始指针

explicit operator bool() const; //显示bool值转型

void swap(scoped_ptr & b); //交换指针

};

template<class T>inline

bool operator==(scoped_ptr<T> const & p, boost::detail::spnullptr_t);//与空指针作比较

scoped_ptr 用法:

成员函数reset()的功能室重置scoped_ptr:他删除原来保存的指针,在保存新的指针值p,如果p为空指针,那scoped_ptr将不持有任何指针。一般情况下,reset()不应该被调用,因为它违背了scoped_ptr的本意-资源应该一直有scoped_ptr自己自动管理

scoped_ptr提供了一个可以在bool语境中自动转换成bool值的情况,例如在if ,用来判断scoped_ptr是否持有一个有效的指针(即非空),例如:if(!sp) //如果sp持有的指针为空

使用new表达式结果构造scoped_ptr对象

scoped_ptr<string> sp(new string("test"));

assert(sp);

assert(sp != nullptr);

assert(sp != 0)

if(!sp) //如果sp持有的指针为空

cout<<"sp is invalid"<<endl;

cout<<*sp<<endl;

cout<<sp->c_str()<<endl;

cout<<sp->size()<<endl;

scoped_ptr把拷贝构造函数和复制函数都声明为私有的,不允许拷贝或赋值,拒绝了指针所有权的转让,只能在scoped_ptr被生命的作用域内使用,其他任何人都没有权限访问被管理的指针,从而保证了指针的绝对安全(有点一棍子打死的感觉,太不方便了,应用的范围小,但是绝对安全),由此引出了另外一个结论:如果一个类持有scoped_ptr成员变量,那么它也是不可拷贝和赋值的。例如:

class prt_owned final

{

scoped_ptr<int> m_ptr;

};

prt_owned p;

ptr_owned p2(p); //编译错误,不能拷贝构造

注意

1、scoped_ptr除了*和->以外没有定义其他操作符,因此不能对scoped_ptr 进行++、--等指针运算

2、如果scoped_ptr保存的是空指针,那么operator*()和operator->()这两个操作的行为未定义


1 0