一个简单的智能指针的实现

#include <iostream>

using namespace std;


// 一个简单的智能指针的实现
template <class T>
class SmartPtr
{
public:
    // 构造函数:p是指向已经动态创建的int对象指针
    SmartPtr(T *p) : m_pHelpPtr(new HelpPtr<T>(p))
    {
    }

    // 复制构造函数:复制成员并将使用计数加1
    SmartPtr(const SmartPtr& orig) : m_pHelpPtr(orig.m_pHelpPtr)
    {
        ++m_pHelpPtr->refCount;
    }

    // 赋值操作符
    SmartPtr& operator=(const SmartPtr& rhs)
    {
        // 增加右操作数中的使用计数
        ++rhs.m_pHelpPtr->refCount;
        // 将左操作数对象的使用计数减1,若该对象的使用计数减至0,则删除该对象
        if (--m_pHelpPtr->refCount == 0)
            delete m_pHelpPtr;
        m_pHelpPtr = rhs.m_pHelpPtr;   // 复制HelpPtr指针
        return *this;
    }

    // 析构函数:如果计数为0,则删除HelpPtr对象
    ~SmartPtr()
    {
        if (--m_pHelpPtr->refCount == 0)
            delete m_pHelpPtr;
    }


    T& operator *()        //重载*操作符
    {
        return *(m_pHelpPtr->ptr);
    }
    T* operator ->()       //重载->操作符
    {
        return m_pHelpPtr->ptr;
    }

private:

    // 一个助手类,实现了引用计数,存放了实际的数据
    template <class X>
    class HelpPtr
    {
    public:
        X *ptr;
        size_t refCount;
        HelpPtr(X *p) : ptr(p) , refCount(1)
        {
            //cout << "HelpPtr constructor called !" << endl;
        }
        ~HelpPtr()
        {
            delete ptr;
            //cout << "HelpPtr distructor called !" << endl;
        }
    };
    HelpPtr<T> *m_pHelpPtr;   //指向使用计数类HelpPtr
};




int main(void)
{

    {
        int *pi = new int(42);
        SmartPtr<int> p = pi;
        p = p;
        cout << *p << endl;
        SmartPtr<int> p1 = p;
        SmartPtr<int> p2 = p1;
        p = p2;

        p1 = p;
        p2 = p1;

        p1 = p2;
        p2 = p1;

    }

    return 0;
}

智能指针是一种能够自动管理动态内存分配的指针,可以避免由于内存分配和释放出错而导致的程序崩溃,并且可以方便地进行资源共享和拷贝。手动实现一个简单智能指针可以按以下步骤进行: 1. 定义一个类来表示智能指针,同时保存指向的内存地址和引用计数。 2. 在类的构造函数对指向的内存进行分配,并将引用计数初始化为1。 3. 在类的析构函数对指向的内存进行释放。 4. 实现拷贝构造函数和赋值运算符重载,用来处理智能指针的拷贝和赋值操作。 5. 在拷贝构造函数和赋值运算符重载更新引用计数,避免多个指针同时指向同一个资源时引用计数出错。 6. 在类定义一个 get() 方法,用来获取指向的内存地址。 7. 在类定义一个 operator->() 方法和 operator*() 方法,分别用来对指向的内存进行指针和解引用操作。 示例代码如下: ``` template<typename T> class SmartPtr { public: SmartPtr() : m_ptr(nullptr), m_use_count(new int(0)) {} SmartPtr(T* ptr) : m_ptr(ptr), m_use_count(new int(1)) {} SmartPtr(const SmartPtr<T>& other) : m_ptr(other.m_ptr), m_use_count(other.m_use_count) { ++*m_use_count; } ~SmartPtr() { --*m_use_count; if (*m_use_count == 0) { delete m_ptr; delete m_use_count; } } SmartPtr<T>& operator=(const SmartPtr<T>& other) { if (this != &other) { --*m_use_count; if (*m_use_count == 0) { delete m_ptr; delete m_use_count; } m_ptr = other.m_ptr; m_use_count = other.m_use_count; ++*m_use_count; } return *this; } T* get() const { return m_ptr; } T& operator*() const { return *m_ptr; } T* operator->() const { return m_ptr; } private: T* m_ptr; int* m_use_count; }; ``` 使用示例: ``` SmartPtr<int> p1(new int(42)); SmartPtr<int> p2(p1); SmartPtr<int> p3; p3 = p1; std::cout << *p1 << std::endl; // 42 *p2 = 24; std::cout << *p1 << std::endl; // 24 std::cout << *p3 << std::endl; // 24 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值