smart memory pool :内存池--智能内存池 新鲜大出炉啦

转,可以,标明出处吧,呵呵。
/************************************************************************
* Smart Memory Pool
* author: kelvin
* date:    2007-11-29
* info: 最近一直想写一个智能内存池,该内存池只有取出操作,当用户不再使用到
        该指针,那么指针自动回到内存池中。这个很类似于智能指针的操作,只是
        智能指针是当没有引用的时候,自动销毁。
        使用者对取出的指针的使用,仅仅通过传递值或者引用来完成。
************************************************************************/

#pragma once

#include <assert.h>
#include <list>
#include <boost/thread/mutex.hpp>

using namespace std;

template <typename T>
class kelvin_SmartMemPool;

template<typename POINTERTYPE>
class kelvin_ptr
{
public:
    int        *m_pRef;
    POINTERTYPE    *m_pPtr;
    kelvin_SmartMemPool< POINTERTYPE > *m_MemPool;

private:
    boost::mutex m_mutexRef;

public:
    explicit kelvin_ptr()
        :m_pRef(NULL)
        ,m_pPtr(NULL)
        ,m_MemPool(NULL)
    {
    }
   
    // 构造一个智能指针
    explicit kelvin_ptr(POINTERTYPE *pPtr,  kelvin_SmartMemPool< POINTERTYPE >* MemPool)
        :m_MemPool(MemPool)
    {
        // 确认指针有效
        assert(pPtr);

        AddRef(NULL);
        m_pPtr = pPtr;
    }

    ~kelvin_ptr() { Release(); }

    // 重载拷贝构造,增加引用记数
    kelvin_ptr(const kelvin_ptr<POINTERTYPE> &obj)
    {
        AddRef(obj.m_pRef);
        m_pPtr = obj.m_pPtr;
        m_MemPool = obj.m_MemPool;
    }

    // 重载赋值操作,使得可以对智能指针之间赋值
    const kelvin_ptr<POINTERTYPE>& operator=(kelvin_ptr<POINTERTYPE> &obj)
    {
        // 首先要减少以前的对象的引用记数,然后在指向新的指针。
        Release();

        AddRef(obj.m_pRef);
        m_pPtr = obj.m_pPtr;
        m_MemPool = obj.m_MemPool;

        return *this;
    }

    // 重载*运算符
    POINTERTYPE& operator*()
    {
        assert(m_pPtr);
        return *m_pPtr;
    }

    // 重载->运算符
    POINTERTYPE* operator->()
    {
        assert(m_pPtr);
        return m_pPtr;
    }

protected:
    // 增加引用记数
    void AddRef(int *pRef)
    {
        if (pRef == NULL)
        {
            m_pRef = new int;
            *m_pRef = 0;
        }
        else
        {
            m_pRef = pRef;
        }

        {
            boost::mutex::scoped_lock lock(m_mutexRef);
            (*m_pRef)++;
        }
        //InterlockedIncrement((LONG*)m_pRef);
    }

    // 减少引用记数
    void Release()
    {
        if (m_pRef != NULL)
        {
            {
                boost::mutex::scoped_lock lock(m_mutexRef);
                (*m_pRef)--;
            }
            //InterlockedDecrement((LONG*)m_pRef);

            if ( (*m_pRef) == 1)
            {
                //SmartMemPool<POINTERTYPE>::T pObj = *this;
                //m_MemPool.freeMem( (SmartMemPool<POINTERTYPE>::T*)(this) );
                m_MemPool->freeMem( *this );
               
                /// 这里由于在放回内存池的时候多了次拷贝构造,引起了记数多1,但是不能继续放在那边去减少记数,
                /// 否则,则循环调用了freeMem.所以在这里对该对象引用记数-1
                {
                    boost::mutex::scoped_lock lock(m_mutexRef);
                    (*m_pRef)--;
                }

                return;
            }

            if ( (*m_pRef) == 0)
            {
                if (m_pPtr != NULL)
                {
                    delete m_pPtr;
                    m_pPtr = NULL;
                }               

                delete m_pRef;
                m_pRef = NULL;
            }
        }
    }
};

template <typename TT>
class kelvin_SmartMemPool
{
public:
    typedef kelvin_ptr<TT> T;

public:
    explicit kelvin_SmartMemPool()
        :m_iMemLength(10)
    {
        //MemPool(10); /** 这里千万不要这么调用,构造中重复调用构造,实际上是生成了临时对象**/
        for (int i = 0; i < m_iMemLength; i++)
        {
            T* pNode = new T(new TT, this);
            assert(pNode);
            m_listMem.push_back( pNode );
        }
    }

    explicit kelvin_SmartMemPool(int iLength)
        :m_iMemLength(iLength)
    {
        for (int i = 0; i < m_iMemLength; i++)
        {
            T* pNode = new T(new TT, this);
            assert(pNode);
            m_listMem.push_back( pNode );
        }
    }

    virtual ~kelvin_SmartMemPool()
    {
        for (list< T* >::iterator itr = m_listMem.begin(); itr != m_listMem.end(); /*itr++*/)
        {
            ((*itr))->~T();
            //delete (*itr);
            //(*itr)->Release();
            *itr = NULL;
            m_listMem.erase(itr++);
        }

        m_listMem.clear();

        m_iMemLength = 0;
    }

    T        getMem()
    {
        T *pNode = NULL;

        {
            boost::mutex::scoped_lock lock(m_mutexLockList);
            if (m_listMem.size() > 0)
            {
                list< T* >::iterator itr = m_listMem.begin();
                pNode = (*itr);
                m_listMem.erase(itr);

                m_iMemLength--;               
            }
            else
            {
                pNode = new T(new TT, this);
                assert(pNode);
                //m_iMemLength++; //这里是个bug,iMemLength应该记载还剩的空余内存
            }
        }

        return *pNode;

    }

    //void    freeMem(T* pNode)
    //{
    //    boost::mutex::scoped_lock lock(m_mutexLockList);
    //    m_listMem.push_back( pNode );
    //    m_iMemLength++;
    //}

    void    freeMem(T Node)
    {
        if (Node.m_MemPool == NULL)
        {
            return ;
        }

        boost::mutex::scoped_lock lock(m_mutexLockList);
        T* pNode = new T();
        *pNode = Node;
        m_listMem.push_back( pNode );
        m_iMemLength++;
    }

    int        getSize()
    {
        return m_iMemLength;
    }

private:
    list< T* >    m_listMem;
    int            m_iMemLength;

    boost::mutex    m_mutexLockList;
};


有兴趣可以跟我留言,共同讨论如何把内存池写的更好,呵呵。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
资源分成两个文件下载(因为单个文件超限禁止上传),请进入我的资源列表下载另一压缩包 Supported MegaRAID Controllers ============================== MegaRAID SAS 9362-4i MegaRAID SAS 9362-8i MegaRAID SAS 9361-4i MegaRAID SAS 9361-8i MegaRAID SAS 9363-4i MegaRAID SAS 9380-8e MegaRAID SAS 9381-4i4e MegaRAID SAS 9361-8iCC MegaRAID SAS 9380-8eCC MegaRAID SAS 9364-8i MegaRAID SAS 9340-8i MegaRAID SAS 9341-8i MegaRAID SAS 9341-4i MegaRAID SAS 9270-8i MegaRAID SAS 9271-4i MegaRAID SAS 9271-8i MegaRAID SAS 9271-8iCC MegaRAID SAS 9286-8e MegaRAID SAS 9286CV-8e MegaRAID SAS 9286CV-8eCC MegaRAID SAS 9265-8i MegaRAID SAS 9285-8e MegaRAID SAS 9240-4i MegaRAID SAS 9240-8i MegaRAID SAS 9260-4i MegaRAID SAS 9260CV-4i MegaRAID SAS 9260-8i MegaRAID SAS 9260CV-8i MegaRAID SAS 9260DE-8i MegaRAID SAS 9261-8i MegaRAID SAS 9280-4i4e MegaRAID SAS 9280-8e MegaRAID SAS 9280DE-8e MegaRAID SAS 9280-24i4e MegaRAID SAS 9280-16i4e MegaRAID SAS 9260-16i MegaRAID SAS 9266-4i MegaRAID SAS 9266-8i MegaRAID SAS 9285CV-8e MegaRAID SAS 8704ELP MegaRAID SAS 8704EM2 MegaRAID SAS 8708ELP MegaRAID SAS 8708EM2 MegaRAID SAS 8880EM2 MegaRAID SAS 8888ELP MegaRAID SAS 8308ELP* MegaRAID SAS 8344ELP* MegaRAID SAS 84016E* MegaRAID SAS 8408E* MegaRAID SAS 8480E* MegaRAID SATA 300-8ELP* Supported HBA Controllers ========================= LSI SAS 9211 LSI SAS 9212 LSI SAS3041E-R LSI SAS3041X-R LSI SAS3080X-R, LSI SAS3081E-R LSI SAS3442E-R LSI SAS3442X-R LSI WarpDrive SLP-300 9212 4i4e-R spec 9211-8i/4i-R spec LSI Nytro WarpDrive WLP4-200 LSI Nytro WarpDrive WLP4-400 LSI Nytro WarpDrive BLP4-400 LSI Nytro WarpDrive BLP4-800 LSI Nytro WarpDrive BLP4-1600 LSI Nytro XD BLP4-400 LSI Nytro XD BLP4-800 LSI SAS 9207-4i4e LSI SAS 9217-4i4e LSI SAS 9207-8i LSI SAS 9217-8i LSI SAS 9207-8e LSI SAS 9201-16e LSI SAS 9200-8e

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值