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
  • 下载

C++实现 带引用计数的智能指针

  • 2012年09月05日 23:07
  • 544KB
  • 下载

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

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

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

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

C++ 引用计数技术及智能指针的简单实现及改进

转载这篇文章点击打开链接 C++ 引用计数技术及智能指针的简单实现 阅读目录 1.智能指针是什么2.普通指针存在的问题3.什么是引用计数4.智能指针实现 ...

C/C++使用Lu键树实现智能指针及检查内存泄露

欢迎访问 Lu程序设计 C/C++使用Lu键树实现智能指针及检查内存泄露 1 说明     要演示本文的例子,你必须下载Lu32脚本系统。本文的例子需要lu32.dll、lu32.lib、C++格式...
  • forcal
  • forcal
  • 2014年01月03日 11:58
  • 1900

C++智能指针简单实现

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

C++中智能指针的实现

C++学习中遇到的问题,记录之。使用的教材: 《C++ primer》。 智能指针?what? how? What ‘s the smartpointer and how to impletm...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++ 一种智能指针的实现
举报原因:
原因补充:

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