【C++】智能指针的原始写法、scoped写法、shared写法

原创 2016年05月30日 15:04:24

  智能指针的三种常见写法:

  一、最开始的原始写法,原始写法可以理解为指针转移的方法。

template<typename T>
class AutoPtr
{
public:
    AutoPtr()
        :_ptr(NULL)
    {}

    AutoPtr(T* ptr)
        :_ptr(ptr)
    {}

    ~AutoPtr()
    {
        if (_ptr)
        {
            delete _ptr;
            _ptr = NULL;
        }
    }

    AutoPtr<T>(AutoPtr<T>& ap)
        : _ptr(ap._ptr)
    {
        ap._ptr = NULL;
    }

    AutoPtr<T>& operator = (AutoPtr<T>& ap)
    {
        if (this != &ap)
        {
            delete _ptr;
            _ptr = ap._ptr;
            ap._ptr = NULL;
        }

        return *this;
    }


    T& operator*()
    {
        return *_ptr;

    }

    T* GerPtr()
    {
        return _ptr;
    }
private:
    T* _ptr;
};

  二、演变为后来的scoped写法,又可以称作守卫写法。该写法相对于原始写法的优点在于不让使用拷贝构造和运算符的重载,这样就避免了深浅拷贝的指针问题。做法是把拷贝构造、运算符的重载定声明出来而不定义,并且用protected保护起来。scoped写法是引用的boost库。有兴趣的可以去了解一下这个东西,背后还是有很多故事的,在这我就不多说啦。

template<class T>
class scopedPtr
{
public:
    scopedPtr()
        :_ptr(NULL)
    {}

    scopedPtr(T* ptr)
        :_ptr(ptr)
    {}

    ~scopedPtr()
    {
        if (_ptr)
        {
            delete _ptr;
            _ptr = NULL;
        }
    }
    
    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }

    T* GetPtr()
    {
        return _ptr;
    }

protected: //加上protected可以防止使用者在类之外定义拷贝构造和运算符的重载函数
    scopedPtr<T>(const scopedPtr<T>& sp);        //不让使用者使用拷贝,可以防止拷贝,所以只声明不定义
    scopedPtr<T>& operator=(const scopedPtr<T>& sp);

private:
    T* _ptr;
};

  三、sharedPtr写法

这种方法考虑了深浅拷贝问题并且引用了引用计数器来解决浅拷贝的问题,比较完善的实现了智能指针想要实现的功能。

template<class T>
class SharePtr
{
public:
    SharePtr(T* ptr)
        :_ptr(ptr)
        , _pCount(new int(1))
    {}

    //SharePtr(Shar)
    //    :_ptr(sp._ptr)
    //{
    //    *_pCount = 1;
    //}

    ~SharePtr()
    {
        if (_ptr)
        {
            if (--(*_pCount) == 0)
            {
                delete _ptr;
                delete _pCount;
                _ptr = NULL;
                _pCount = NULL;
            }

            _ptr = NULL;
        }
    }

    SharePtr<T>(const SharePtr<T>& sp)
    {
        _ptr = sp._ptr;
        _pCount = sp._pCount;
        ++(*_pCount);
    }

    SharePtr<T>& operator=(const SharePtr<T>& sp)
    {
        if (this != &sp)
        {
            if (--(*_pCount) == 0)    //这里要分清楚是谁减一,逻辑需要分析清楚
            {
                delete _ptr;
                delete _pCount;
                _ptr = NULL;
                _pCount = NULL;
            }

            _ptr = sp._ptr;
            _pCount = sp._pCount;
            ++(*_pCount);
        }
        return *this;
    }

private:
    T* _ptr;
    int* _pCount;
};


本文出自 “滴水” 博客,请务必保留此出处http://10740329.blog.51cto.com/10730329/1766046

版权声明:本文为博主原创文章,未经博主允许不得转载。

SQL Update的四种常见写法

/* 实验对象:两个学生表 1. 一个stu学生表,一个stu1学生表. 2. 上述表有三个字段 (学生id,学生性别,学生名字) *//* update语句常见场景,分为两大类...
  • wuya814070935
  • wuya814070935
  • 2017年05月24日 13:16
  • 1399

11种提高Java性能的写法

1.循环  ■ 在重要的循环里,消除循环终止判断时的方法调用。 例如:将  for(int i=0; i        ... } 替换为  for(int i=0; n=collect...
  • qduningning
  • qduningning
  • 2014年06月06日 11:29
  • 1387

jQuery插件的几种写法

之前在一篇求职的帖子上看过,前端面试的景点题目:jquery插件的几种写法。 这是看到的一篇总结。比较到位。详尽且简单易懂。如果之前看过jquery的源码,应该特别好理解了。 插件编写的目...
  • xixi880928
  • xixi880928
  • 2016年06月27日 16:12
  • 3742

python中循环的写法 for

最近倒腾python,希望能坚持下去吧
  • garfieldswimming
  • garfieldswimming
  • 2014年05月08日 11:15
  • 3167

hql的几种写法

Java代码   String sql = "select * from T_TMP_PUBLIC_POLICY TP";  SQLQuery sqluery = session.createS...
  • laokaizzz
  • laokaizzz
  • 2015年04月11日 15:15
  • 471

JS模块化写法

随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂。 网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件工程的...
  • lipc_
  • lipc_
  • 2016年07月25日 15:51
  • 3181

bat批处理写法

“rd”是删除目录的命令,它是RemoveDirectory的缩写 “md”是建立目录的命令,它是MakeDirectory的缩写 “cd”是更换当前目录的命令,它是ChangeDirectory...
  • riverflowrand
  • riverflowrand
  • 2015年10月10日 21:01
  • 973

jquery的链式写法

jquery的链式写法 .divFrame{ width:260px; border:solid 1px #f00; font-size;10pt; }...
  • yecats
  • yecats
  • 2016年05月27日 21:58
  • 2239

ajax的常见几种写法以及用法

一、服务端数据格式 1.自定义po类 package com.hbut.ssm.po; /** * pojo类 * */ public class Children { private S...
  • wickedvalley
  • wickedvalley
  • 2017年03月25日 17:01
  • 5583

递归写法总结

递归写法总结 递归是算法中的一种很重要思想。好的递归程序逻辑清楚,代码简洁,有时候时间上也非常高效;此外链表、二叉树等结构用递归算法一般都有鲜明优势。 往往递归问题口头说起来感觉十分清晰顺畅;而用代...
  • jack_thu
  • jack_thu
  • 2015年05月18日 13:07
  • 1552
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++】智能指针的原始写法、scoped写法、shared写法
举报原因:
原因补充:

(最多只允许输入30个字)