#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;
int m_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();
}
本文介绍如何使用C++实现一个简单的内存池,参考了Poco库的设计,旨在提供一种理解和实现内存池的简洁方法。通过内存池管理内存,可以提高分配和释放效率,减少碎片。
3455

被折叠的 条评论
为什么被折叠?



