zoukankan      html  css  js  c++  java
  • 智能指针之scope_ptr与auto_ptr的区别

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

    但scope_ptr的所有权更加严格,不能转让,一旦scope_ptr获得了对象的管理权,你就无法再从它那里取回来.

    自己实现的scope_ptr智能指针

    template<typename T>
    class Scope_Ptr
    {
    public:
    Scope_Ptr(T* ptr) :mptr(ptr){}
    ~Scope_Ptr()
    {
    delete mptr;
    mptr = NULL;
    }
    T& operator*()
    {
    return *mptr;
    }
    T* operator->()
    {
    return mptr;
    }
    private:
    T* mptr;
    Scope_Ptr(const Scope_Ptr<T>&);
    Scope_Ptr<int>& operator=(const Scope_Ptr<T>&);
    };

    int main()
    {
    int* p = new int;
    Scope_Ptr<int> sp1(p);
    Scope_Ptr<int> sp2(p);
    Scope_Ptr<int> sp3(p);
    return 0;
    }

    scope_ptr不允许拷贝,赋值,只能在scope_ptr被声明的作用域内使用,除了*和->外scope_ptr也没有定义其他的操作符(不能对scope_ptr进行++或者--等

    指针算术操作),与普通指针相比它只有很小的接口,因此使指针的使用更加安全,更容易使用同时更不容易被误用。

    sp++;                                               //错误,scope_ptr未定义递增操作符

    scope_ptr<string>  sp2=sp;           //错误,scope_ptr不能拷贝构造

    scope_ptr的用法与auto_ptr几乎一样,大多数情况下它可以与auto_ptr相互替换,也可以从一个auto_ptr获得指针的管理权(同时auto_ptr失去管理权)

    scope_ptr和auto_ptr同样的“缺陷”,不能用作容器的元素,但原因不同:

    auto_ptr是因为它的转移语义,而scope_ptr则是因为不支持拷贝和赋值,不符合容器对元素类型的要求。

    scope_ptr与auto_ptr的根本区别在于指针的所有权。auto_ptr特意被设计为指针的所有权是可转移的,可以在函数之间传递,

    同一个时刻只能有一个auto_ptr管理指针,他的用意是好的,scope_ptr把拷贝构造函数和赋值函数都声明为私有的,拒绝了指针的所有权转让,

    任何人都无权访问被管理的指针,从而保证了指针的绝对安全。

    auto_ptr<int>  ap(new int(10));

    scope_ptr<int> sp(ap);

    assert(ap.get()==0);

    ap.reset(new int(20));

    cout<<*ap<<","<<*sp<endl;

    auto_ptr<int> ap2;

    ap2=ap;

    assert(ap.get()==0)

    scope_ptr<int> sp2;

    sp2=sp;      //赋值错误,无法通过编译

    如果代码编写者企图从一个scope_ptr构造或赋值另一个scope_ptr,那么编译器会报出一个错误,阻止他这么做,从而保护了你的代码,而且是在编译期间.

  • 相关阅读:
    洛谷P1434 滑雪
    P1855 榨取kkksc03
    C#中将表示颜色的string转换成Color
    DevExpress的对话框XtraMessageBox的使用
    Winform中怎样根据Name获取同窗体的控件
    Winform中使用代码编写Button按钮的点击事件
    SqlServer 2014还原数据库时提示:无法在已有的""上还原文件,请重新发出RESTORE语句,用WITH REPLACE来覆盖原先存在的文件
    SqlServer 2014 还原数据库时提示:操作系统返回了错误5,,拒绝访问
    Windows 7 上怎样打开SQL Server 配置管理器
    SqlServer2014怎样还原数据库
  • 原文地址:https://www.cnblogs.com/xcb-1024day/p/11332337.html
Copyright © 2011-2022 走看看