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++面试时候的一般都是这个套路:      1,C++和C相比最大的特点——面向对象:封装,继承,多态。      2,你知道虚函数吗?——实现多态所必须,父类类型的指针指向子类的实例,执行的时...
  • worldwindjp
  • worldwindjp
  • 2014年01月28日 17:00
  • 11985

一个智能指针的实现

1.什么是智能指针? C++智能指针是行为类似于指针的类对象。它使用设计模式中的代理模式,代理了原始“裸”指针的行为,为指针添加了更多更有用的特性。C++引入异常机制后,智能指针由一种技巧升级为一种...
  • mfcbest
  • mfcbest
  • 2016年09月23日 15:53
  • 1076

C++智能指针(二)模拟实现三种智能指针

在上一篇博客中提到了Auto_ptr(C++智能指针(一)),下面进行模拟实现Auto_ptr 采用类模板实现#include using namespace std; template class...
  • Nou_Camp
  • Nou_Camp
  • 2017年04月15日 20:34
  • 384

链表类的设计与实现(智能指针)

最近读《C++primer》的时候发现了智能指针这个东西,简直好用,用习惯后相较于new和delete代码要简洁不少/****链表类设计与实现,默认构造,拷贝构造,插入,删除,获得长度,显示链表数据*...
  • qq_30257885
  • qq_30257885
  • 2016年04月14日 08:51
  • 653

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

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

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

总结了c++中三种复制控制的场合和具体实现方法,在此基础上设计自己的智能指针类。...
  • wenzhou1219
  • wenzhou1219
  • 2016年06月04日 21:02
  • 1400

【C++】智能指针之引用计数的实现

本文将简单的介绍,C++11中的智能指针的引用计数大致是如何实现的。部分内容节选自 C++ primer 5th。...
  • zone_programming
  • zone_programming
  • 2015年09月11日 15:16
  • 2990

单例的智能指针实现

前面提出了一个问题:可不可以不需要我们手动的调用 release() 函数,程序结束前自动的删除单例类的对象呢?答案是可以,使用智能指针可以达到这个目的,这里我们使用的是 Qt 的 QScopedPo...
  • Andy_93
  • Andy_93
  • 2016年10月10日 17:33
  • 729

【C++】编写一个智能指针类。

编写一个智能指针类。 智能指针是一个数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制。 它会自动记录SmartPointer对象的引用计数,一旦T类型对象的引用计数为0,就释放该...
  • michellechouu
  • michellechouu
  • 2015年07月24日 13:47
  • 775

c++ primer智能指针实现

  • huruzun
  • huruzun
  • 2014年04月23日 11:22
  • 935
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++ 一种智能指针的实现
举报原因:
原因补充:

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