智能指针:boost学习

前段时间,由于需要,在项目中使用了boost。boost提供了简洁实用的封装。可以使得我们在使用的时候不必关注其内部的实现方法。但是,作为c++程序员,最大的爱好就是学习了了解技术的细节本身。

所以,我抽取了一些时间学习了boost的部分功能实现。

这里先贴出一个关于智能指针的实现原理。

/// 本程序模拟boost::share_ptr的简单效果
/// 作者:kelvin
/// 日期:2007-11-16
/// 缺陷:该代码没有考虑在多线程下的应用,多线程下,主要需要控制记数的增加或者减少的互斥性.
///          如果在windows下使用,可以使用简单的一个方法实现线程安全,代码注释掉了。
///       这里的代码没有很细致的参考boost,仅仅从一个理解的角度进行编写的。可能还有很多不足,谢谢大家指出.

#include <assert.h>
//#include <windows.h>

template<typename POINTERTYPE>
class kelvin_ptr
{
public:
    int        *m_pRef;
    POINTERTYPE    *m_pPtr;

public:
    kelvin_ptr():m_pRef(NULL),m_pPtr(NULL) {}
    virtual ~kelvin_ptr() { Release(); }

    // 构造一个智能指针
    template<typename POINTERTYPE>
    explicit kelvin_ptr(POINTERTYPE *pPtr)
    {
        // 确认指针有效
        assert(pPtr);

        AddRef(NULL);
        m_pPtr = pPtr;
    }

    // 重载拷贝构造,增加引用记数
    kelvin_ptr(kelvin_ptr<POINTERTYPE> &obj)
    {
        AddRef(obj.m_pRef);
        m_pPtr = obj.m_pPtr;
    }

    // 重载赋值操作,使得可以对智能指针之间赋值
    const kelvin_ptr<POINTERTYPE>& operator=(kelvin_ptr<POINTERTYPE> &obj)
    {
        // 首先要减少以前的对象的引用记数,然后在指向新的指针。
        Release();

        AddRef(obj.m_pRef);
        m_pPtr = obj.m_pPtr;

        return *this;
    }

    // 重载*运算符
    POINTERTYPE& operator*()
    {
        assert(m_pPtr);
        return *m_pPtr;
    }

    // 重载->运算符
    POINTERTYPE* operator->()
    {
        assert(m_pPtr);
        return m_pPtr;
    }

private:
    // 增加引用记数
    void AddRef(int *pRef)
    {
        if (pRef == NULL)
        {
            m_pRef = new int;
            *m_pRef = 0;
        }
        else
        {
            m_pRef = pRef;
        }

        (*m_pRef)++;
        //InterlockedIncrement((LONG*)m_pRef);
    }

    // 减少引用记数
    void Release()
    {
        if (m_pRef != NULL)
        {
            (*m_pRef)--;
            //InterlockedDecrement((LONG*)m_pRef);

            if ( (*m_pRef) == 0)
            {
                if (m_pPtr != NULL)
                {
                    delete m_pPtr;
                    m_pPtr = NULL;
                }               

                delete m_pRef;
                m_pRef = NULL;
            }
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值