内存池模板 参考Poco库 简单易懂

来源:互联网 发布:ping ip 端口 编辑:程序博客网 时间:2024/05/21 05:17
#pragma once#include <vector>#include "Poco\Mutex.h"template<class T>class CFramePool{public:CFramePool(int preAlloc, int maxAlloc = 0);~CFramePool();/**@des 申请一个T*/T* get();/**@des 释放一个T*/void release(T* ptr);/**@des获取池的大小*/int allocated() const;/**@des可用个数*/int available() const;private:CFramePool();//缺省构造??CFramePool(CFramePool&); //默认复制构造CFramePool& operator =(const CFramePool&); //默认赋值Poco::FastMutex m_MtxBlocks;std::vector<T*>m_vecBlocks;intm_nAllocated;int m_nMaxAlloc;};//函数定义template<class T>CFramePool<T>::CFramePool(int preAlloc, int maxAlloc/* = 0*/) :m_nMaxAlloc(maxAlloc),m_nAllocated(preAlloc){m_vecBlocks.clear();for (int i = 0; i < preAlloc; i++){T* ptr = new T;m_vecBlocks.push_back(ptr);}}template<class T>CFramePool<T>::~CFramePool(){std::vector<T*>::iterator it = m_vecBlocks.begin();for (; it != m_vecBlocks.end(); it++){T* ptr = *it;delete ptr;}}template<class T>T* CFramePool<T>::get(){Poco::FastMutex::ScopedLock lock(m_MtxBlocks);if (m_vecBlocks.empty()){if (m_nAllocated < m_nMaxAlloc){++m_nAllocated;T* ptr = new T;return ptr;}else{//throw OutOfMemoryException("MemoryPool exhausted");return NULL;}}else{T* ptr = m_vecBlocks.back();m_vecBlocks.pop_back();return ptr;}}template<class T>void CFramePool<T>::release(T* ptr){Poco::FastMutex::ScopedLock lock(m_MtxBlocks);m_vecBlocks.push_back(ptr);}template<class T>int CFramePool<T>::allocated() const{Poco::FastMutex::ScopedLock lock(m_MtxBlocks);return m_nAllocated;}template<class T>int CFramePool<T>::available() const{Poco::FastMutex::ScopedLock lock(m_MtxBlocks);return m_vecBlocks.size();}





0 0
原创粉丝点击