c++ 一种智能指针的实现

原创 2016年08月30日 19:13:08

智能指针源码实现,该部分实现是从一开源源码中获取: 

#include <iostream>
#include <windows.h>
using namespace std;

#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }

class KRefCount
{
public:
    KRefCount():m_nCount(0){}

public:
	unsigned AddRef(){ return InterlockedIncrement(&m_nCount); }
	unsigned Release(){ return InterlockedDecrement(&m_nCount); }
    void Reset(){ m_nCount = 0; }

private:
    unsigned long m_nCount;
};

template <typename T>
class SmartPtr
{
public:
    SmartPtr(void)
        : m_pData(NULL)
    {
        m_pReference = new KRefCount();
        m_pReference->AddRef();
    }

    SmartPtr(T* pValue)
        : m_pData(pValue)
    {
        m_pReference = new KRefCount();
        m_pReference->AddRef();
    }

    SmartPtr(const SmartPtr<T>& sp)
        : m_pData(sp.m_pData)
        , m_pReference(sp.m_pReference)
    {
        m_pReference->AddRef();
    }

    ~SmartPtr(void)
    {
        if (m_pReference && m_pReference->Release() == 0)
        {
            SAFE_DELETE(m_pData);
            SAFE_DELETE(m_pReference);
        }
    }

    inline T& operator*()
    {
        return *m_pData;
    }

    inline T* operator->()
    {
        return m_pData;
    }

    SmartPtr<T>& operator=(const SmartPtr<T>& sp)
    {
        if (this != &sp)
        {
            if (m_pReference && m_pReference->Release() == 0)
            {
                SAFE_DELETE(m_pData);
                SAFE_DELETE(m_pReference);
            }

            m_pData = sp.m_pData;
            m_pReference = sp.m_pReference;
			m_pReference->AddRef();
        }

        return *this;
    }

    SmartPtr<T>& operator=(T* pValue)
    {
        if (m_pReference && m_pReference->Release() == 0)
        {
            SAFE_DELETE(m_pData);
            SAFE_DELETE(m_pReference);
        }

        m_pData = pValue;
        m_pReference = new KRefCount;
		m_pReference->AddRef();
        return *this;
    }

    T* Get()
    {
        T* ptr = NULL;        
        ptr = m_pData;

        return ptr;
    }

    void Attach(T* pObject)
    {
        if (m_pReference->Release() == 0)
        {
            SAFE_DELETE(m_pData);
            SAFE_DELETE(m_pReference);
        }

        m_pData = pObject;
        m_pReference = new KRefCount;
        m_pReference->AddRef();
    }

    T* Detach()
    {
        T* ptr = NULL;

        if (m_pData)
        {           
            ptr = m_pData;
            m_pData = NULL;
            m_pReference->Reset();
        }
        return ptr;
    }

private:
    KRefCount* m_pReference;
    T* m_pData;
};


测试程序:

class CTest
{
public:
	CTest(int b) : a(b) {}
	
	int GetA()
	{
		return a;
	}
	
private:
	int a;
};

int main()
{
	SmartPtr<CTest> pSmartPtr1(new CTest(10));
	SmartPtr<CTest> pSmartPtr2(new CTest(20));
	
	printf("pSmartPtr1: %d\n", pSmartPtr1->GetA());
	printf("pSmartPtr2: %d\n", pSmartPtr2->GetA());
	
	pSmartPtr1 = pSmartPtr2;
	
	printf("pSmartPtr1: %d\n", pSmartPtr1->GetA());
	printf("pSmartPtr2: %d\n", pSmartPtr2->GetA());
	getchar();
}




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

相关文章推荐

C++一种智能指针的实现

引子 C++智能指针shared_ptr<> 以对象管理资源 一种智能指针的实现 C++智能指针shared_ptr<>为了兼容C语言,并且由于垃圾回收的性能原因,C++没有引入垃圾回收。但是动态内存...

c++智能指针的实现

  • 2015-07-02 17:50
  • 715KB
  • 下载

一种基于引用计数机制的智能指针实现

http://www.cppblog.com/OnTheWay2008/archive/2010/12/17/136810.html    很久以前就对基于引用计数的指针指针很感兴趣,今天突然又一次...

C++智能指针简单实现

#include #include #include #include namespace smart_pointer { // RAII(Resource Acquisition Is ...

c++智能指针的原理与简单实现

一、问题的引入 先看一段简单的代码如下: #include using namespace std; class Person { private: char *name ; public: ...

c++ 复制控制和智能指针实现

总结了c++中三种复制控制的场合和具体实现方法,在此基础上设计自己的智能指针类。

C/C++知识要点5——智能指针原理及自定义实现

智能指针概述: 智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象。 C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr 区别是...

C++中智能指针的工作原理和简单实现

智能指针:它的一种通用实现方法是采用引用计数的方法。智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。     每次创建类的新对象时,初始化指针并将引用计数置为1;...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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