C++智能指针scoped_ptr的原理和使用
欢迎使用Markdown编辑器
scoped_ptr:局部指针,仅在作用域中使用,不希望被转让。
头文件:”boost/scoped_ptr.hpp”.
代码实现如下:
template<class T>
class scoped_ptr{
private:
T *px;
scoped_ptr(scoped_ptr const &);
scoped_ptr & operator=(scoped_ptr const &);
public:
explicit scoped_ptr(T *p = 0);
~scoped_ptr();
void reset(T *p = 0);
T & operator*()const;
T * operator->()const;
T * get()const;
operator unspecified-bool-type()const;
void swap(scoped_ptr & b);
};
成员函数讲解
scoped_ptr(scoped_ptr const &)和scoped_ptr & operator=(scoped_ptr const &)
scoped_ptr同时把拷贝构造函数和赋值操作都声明为私有的,禁止对智能指针的复制操作,保证了被它管理的指针不能被转让所有权。
explicit scoped_ptr(T* p=0)
构造函数,存储p的一份拷贝。注意,p 必须是用operator new分配的,或者是null. 在构造的时候,不要求T必须是一个完整的类型。当指针p是调用某个分配函数的结果而不是直接调用new得到的时候很有用:因为这个类型不必是完整的,只需要类型T的一个前向声明就可以了。这个构造函数不会抛出异常。
~scoped_ptr()
删除指针所指向的对象。类型T在被销毁时必须是一个完整的类型。如果scoped_ptr在它被析构时并没有保存资源,它就什么都不做。这个析构函数不会抛出异常。
void reset(T* p=0)
void reset(_Ty * p = 0) //never throw
{
this_type(p).swap(*this);
}
成员函数reset()的功能是重置scoped_ptr;它删除原来报存的指针,再保存新的指针值p。如果p是空指针,那么scoped_ptr将不能持有任何指针。一般情况下reset()不应该被调用,因为它违背了scopd_ptr的本意——资源应该一直由scopd_ptr自己自动管理。
T& operator*() const;
该运算符返回一个智能指针中存储的指针所指向的对象的引用。由于不允许空的引用,所以解引用一个拥有空指针的scoped_ptr将导致未定义行为。如果不能肯定所含指针是否有效,就用函数get替代解引用。这个函数不会抛出异常。
T* operator->() const;
返回智能指针所保存的指针。如果保存的指针为空,则调用这个函数会导致未定义行为。如果不能肯定指针是否空的,最好使用函数get。这个函数不会抛出异常。
T* get() const;
返回保存的指针。应该小心地使用get,因为它可以直接操作裸指针。但是,get使得你可以测试保存的指针是否为空。这个函数不会抛出异常。get通常在调用那些需要裸指针的函数时使用。
operator unspecified_bool_type() const
返回scoped_ptr是否为非空。返回值的类型是未指明的,但这个类型可被用于Boolean的上下文(boolean context)中。在if语句中最好使用这个类型转换函数,而不要用get去测试scoped_ptr的有效性。
void swap(scoped_ptr& b)
swap()成员函数可以交换两个scopd_ptr保存的原始指针
template<typename T> void swap(scoped_ptr<T>& a,scoped_ptr<T>& b)
void swap(scoped_ptr & b)
{
_Ty * tmp = b.px;
b.px = px; //tmp临时变量在交换后被释放
px = tmp; //保证只被一个智能指针管理
}