智能指针之scoped_ptr

scoped_ptr是一个类似auto_ptr的智能指针,scoped_ptr可以保证new操作符在堆上创建的对象在任何时候都可以被正确的删除。
scoped_ptr的最大特点就是一旦scoped_ptr拥有了某个对象的所有权,就无法再次取回!

scoped_ptr的构造函数:

scoped_ptr(T *p=0):px(p)
{
}
//其接受T*类型的指针p,创建出对象,并在该对象内部保存指针参数p,此处p必须是一个new动态分配的结果,或者是一个空指针

scoped_ptr的析构函数:

~scoped_ptr()
{
     delete px;
}
//对象的生命周期结束后,析构函数调用delete自动销毁所保存的对象

scoped_ptr为了保证被其管理的指针的所有权不被转移,就将其拷贝构造和赋值函数设置为私有的:

private:
    T *px;
    scoped_ptr(scoped_ptr cosnt &);
    scoped_ptr& operator=(scoped_ptr const &);

scoped_ptr的成员函数reset():重置scoped_ptr,删除原来保存的指针,再保存新的指针,若新指针为空,则scoped_ptr将不持有任何指针:

void reset(T *p = 0)
{
    T(p).swap(*this);
}
void swap(scoped_ptr &b)  //交换两个scoped_ptr保存的指针
{
     _T *tmp = b.px;
     b.px = px;
     px = tmp;
}

scoped_ptr不支持比较操作,不能判断两个指针的相等或不相等,因为其operator== 和 operator!= 操作被声明为私有的:

private:
    void operator==(scoped_ptr const &)const;
    void operator!=(scoped_ptr const &)const;

scoped_ptr的成员函数get():得到scoped_ptr内部保存的指针,不可对该指针进行delete操作,否则会在scoped_ptr析构时会对已经删除的指针再进行删除操作:

T *get()const
{
     return px;
}

注意:
scoped_ptr不再需要delete操作scoped_ptr会自动释放资源

以下是我对scoped_ptr的测试:

#include<iostream>
#include<memory>
#include<boost/smart_ptr.hpp>

using namespace std;
using namespace boost;


//scoped_ptr不需要delete操作,因其会自动释放资源
//scoped_ptr不能进行拷贝构造,所以不能执行scoped_ptr<int> ps = p;(错误)
int main()
{
    scoped_ptr<int> p1;
    int *p = new int(10);
    scoped_ptr<int> ps(p);
    cout<<*ps<<endl;
    cout<<*p<<endl;

    *ps = 20;
    cout<<*ps<<endl;
    //p1 = ps; //scoped_ptr不支持赋值和拷贝构造,因为其是私有操作

    int *q = new int(30);
    ps.reset(q);   //重置
    cout<<*ps<<endl;

    int *m = new int(40);
    auto_ptr<int> ps1(m);
    scoped_ptr<int> ps2(ps1);
    cout<<*ps2<<endl;
    //cout<<*ps1<<endl; //其拥有权已被转移至scoped_ptr的ps2,该指针已经指向空
    ps1.reset(new int(50));
    cout<<*ps1<<endl;

    return 0;
}

你可能感兴趣的:(reset,get,智能指针,auto-ptr,scoped-ptr)