`

智能指针的实例

    博客分类:
  • C++
 
阅读更多
#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) {}
private:
	int a;
};

int main()
{
	SmartPtr<CTest> pSmartPtr1(new CTest(10));
	SmartPtr<CTest> pSmartPtr2(new CTest(20));

	pSmartPtr1 = pSmartPtr2;
}
分享到:
评论

相关推荐

    C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载)

    在`Source.cpp`中,我们可以编写一些测试代码来验证这个智能指针的正确性,例如创建多个智能指针实例,赋值,解引用等操作,确保内存被正确管理。 通过这种方式,初学者可以理解智能指针的工作原理,并学习如何在...

    C++ 智能指针

    C++ 智能指针 C++ 智能指针是一种特殊的指针,它可以自动管理动态分配的内存,避免了手动释放内存带来的问题。智能指针的实现是通过模板类 auto_ptr 来实现的。 auto_ptr 类模板的构造函数 ----------------------...

    智能指针的介绍和用法

    通过实例化CBodyPtr、CPolygonPtr、CCurve2dPtr等typedef声明的智能指针类型,可以方便地对特定类型的对象进行智能指针管理。在实践中,通过几个小例子展示了CReferenced和CRefPtr的基本使用方法,包括普通构造和...

    智能指针的一个实现 中科大 面向对象课程

    智能指针是C++编程中一个非常重要的概念,它是一种对象,可以自动管理动态分配的内存。在C++中,智能指针通过模仿原始指针的行为,并附加了额外的资源管理功能,避免了手动调用`new`和`delete`可能导致的内存泄漏...

    smartptr——基于自动引用计数的智能指针

    智能指针相信大家听说过吧,我理解的智能指针,既是一个C++模板类,重载了指针操作符(-&gt;)和(*)操作符,而使它的实例可以"用指针的形式去调用"。 它可以接管任意类型的指针,所以你只需要放心大胆的new出任意对象...

    C++智能指针-unique-ptr智能指针详解.pdf

    《C++智能指针——unique_ptr智能指针详解》 智能指针是C++中用于自动管理动态分配内存的一种工具,它可以确保在适当的时候自动释放内存,从而避免内存泄漏的问题。其中,`unique_ptr`是一种特殊的智能指针,它拥有...

    C++智能指针及容器测试用例

    2. `std::shared_ptr`:共享所有权的智能指针,可以被多个`std::shared_ptr`实例所持有。当最后一个`std::shared_ptr`销毁时,对象会被自动删除。它通过内部引用计数机制来实现共享。 3. `std::weak_ptr`:弱引用...

    Boost智能指针示例源码

    在C++编程中,智能指针是一种非常重要的工具,它能自动管理内存,避免内存泄漏。Boost库提供了几种智能指针类型,其中`shared_ptr`和`weak_ptr`是两个关键的成员。在这个名为"Boost智能指针示例源码"的压缩包中,...

    C++ 智能指针深入解析

    智能指针实际上持有句柄类的实例,而不是直接持有原始指针。这样可以实现更复杂的逻辑,例如弱引用、线程安全的引用计数等。 4. C++标准库中的智能指针 C++标准库提供了三种主要的智能指针类型: - `std::unique_...

    SmartPtr_Reference_Count

    3. `main.cpp`: 这是程序的主入口点,通常包含测试和使用智能指针的代码,展示了如何创建、赋值和销毁智能指针实例。 4. `String.h`, `RCObject.h`: 这两个是相应的类声明,定义了`String`和`RCObject`类的接口。 ...

    一个涉及智能指针,临界区,唯一实例,类模板和线程安全的类的编写例子

    一个涉及智能指针,临界区,唯一实例,类模板和线程安全的类的编写例子, 可以直接调用使用。适合c c++ 初学者参考使用

    代理模式+智能指针SharePtr代码

    在这个“SharePtr”的实现中,可能包含了自定义的智能指针类,它模仿了`std::shared_ptr`的行为,但可能具有特定的增强功能或适应了代理模式的需求。例如,智能指针可能被用作代理类的一部分,以确保在代理生命周期...

    C++STL中智能指针介绍

    智能指针是C++编程中用于自动管理动态内存的一种机制,尤其在STL(Standard Template Library)和TR1(Technical Report 1)库中扮演着重要角色。它们的主要目标是解决手动内存管理带来的问题,如内存泄漏和重复释放...

    一个最小的sharedunique_ptr实现来处理booststdsharedunique_ptr不可用的情况。.zip

    4. **析构函数**:当智能指针实例被销毁时,需要检查引用计数并决定是否需要删除实际对象。 5. **操作符`*`和`-&gt;`**:为了让自定义智能指针能像普通指针一样使用,需要重载解引用和成员访问操作符。 6. **`get()`...

    C++中智能指针如何设计和使用

    每个智能指针类内部维护一个计数器,每当有新的智能指针实例指向同一个对象时,计数器加1;相反,当智能指针实例被销毁或赋值给其他智能指针时,计数器减1。当计数器归零时,表明没有智能指针再引用该对象,于是自动...

Global site tag (gtag.js) - Google Analytics