zoukankan      html  css  js  c++  java
  • 理解scope_ptr的内部实现

    今天我们来谈论scope_ptr(局部智能指针),我们将与auto进行区别式进行阐述:

    1.scope_ptr和auto_ptr类似,能够非常方便正确的删除创建的的对象。

    2.scope_ptr在获取对象所指空间的控制权后,是不能将本空间的控制权在交由他人管理。这是与auto_ptr的区别。

    3.scope_ptr在操作上面,不能实现拷贝构造、=(赋值)、判断相等或者不等(我们在这里实现这些,采用将这些函数写在类的私有属性中)。

    4.最后我们在详谈当中的reset函数和swap函数:

    typedef scope_ptr<int> this_type;
    void
    reset(T *p=0) { assert(p != 0 && p != px); this_type(p).swap(*this); } void swap(scope_ptr &b) { T *tmp = b.px; b.px = px; px = tmp; }

    reset函数操作流程图如下:

    1.this_type是我们宏定义的一种类类型;this_type(p).swap(*this),传入参数p调用构造函数创建无名临时对象来调用swap函数;注意:无名临时对象出了作用于会自动释放所指向的空间,所以不会造成内存泄漏。

    2.在调用swap函数后,this指针的指向会发生变化。注意图二

    3.swap函数执行指针交换指向的操作。

    scope_ptr实现代码如下:

    template<class T>
    class scope_ptr
    {
    private:
        scope_ptr(scope_ptr const &);
        scope_ptr &operator=(scope_ptr const &);
        void operator==(scope_ptr const &)const;
        void operator!=(scope_ptr const &)const;
    public:
        explicit scope_ptr(T *p = 0) :px(p) {} //构造函数
        ~scope_ptr()
        {
            delete px;
        }
    public:
        void reset(T *p=0)
        {
            assert(p != 0 && p != px);
            this_type(p).swap(*this);
        }
        void swap(scope_ptr &b)
        {
            T *tmp = b.px;
            b.px = px;
            px = tmp;
        }
        T * operator->()const
        {
            assert(px != 0);
            return px;
        }
        T & operator*()const
        {
            assert(px != 0);
                return *px;
        }
    private:
        T *px;
    };
    int main()
    {
        int *p = new int(10);
        scope_ptr<int> pa(p);
        cout << *pa << endl;
        return 0;
    }
  • 相关阅读:
    Java 从入门到进阶之路(五)
    Java 从入门到进阶之路(四)
    Java 从入门到进阶之路(三)
    Java 从入门到进阶之路(二)
    Java 从入门到进阶之路(一)
    调用百度翻译 API 来翻译网站信息
    jquery.i18n 网站呈现各国语言
    VUE+Element UI实现简单的表格行内编辑效果
    Python 爬虫从入门到进阶之路(十八)
    Python 爬虫从入门到进阶之路(十七)
  • 原文地址:https://www.cnblogs.com/single-dont/p/10431475.html
Copyright © 2011-2022 走看看