智能指针

// 智能指针
// 作用:
//        1. 管理堆内存
// 使用约束:
//        1. 不能将栈对象取地址后赋值给智能指针
//        2. 每一个对应的堆对象地址只能赋值给一个智能指针对象

#pragma once

template<class T>
class CSmartPoint
{
    unsigned int* piCount;
    T* p;
public:
    CSmartPoint()
    {
        piCount = new unsigned int(0);
        p = NULL;
    }

    ~CSmartPoint()
    {
        (*piCount)--;

        if (p && (*piCount) == 0)
        {
            delete piCount;
            piCount = NULL;
            delete p;
            p = NULL;
        }
    }

    CSmartPoint(T* pt)
    {
        piCount = new unsigned int(1);
        if (p)
        {
            this->~CSmartPoint();
        }

        p = pt;
    }

    CSmartPoint(const CSmartPoint& sp)
    {
        piCount = sp.piCount;
        (*piCount)++;
        p = sp.p;
    }

    T* get()
    {
        return p;
    }

    unsigned int count()
    {
        return *piCount;
    }

    CSmartPoint& operator=(T* pt)
    {
        if (p == pt)
        {
            return *this;
        }

        if (p)
        {
            this->~CSmartPoint();
        }

        p = pt;

        return *this;
    }

    CSmartPoint& operator=(CSmartPoint& sp)
    {
        if (p == sp.p)
        {
            return *this;
        }

        if (p)
        {
            this->~CSmartPoint();
        }

        piCount = sp.piCount;
        (*piCount)++;
        p = sp.p;

        return *this;
    }

    T* operator->()
    {
        return p;
    }
};
posted @ 2014-07-18 16:50  汪成龙  阅读(167)  评论(0)    收藏  举报