内存池的实现:
在堆内存中申请一大块内存当作内存模块,为了避免内存块的使用浪费,将内存模块根据所装载的内存块大小,分为不同的内存池。
定义一个结构体用来表示内存块信息,定义节点指针,方便内存块使用与归还,定义内存池标记表示是否属于内存池中的内存单元(当内存池中的内存单元使用完毕后,向系统申请的标记)。
//内存信息块的结构
typedef struct stMemoryBlock
{
MemoryPool* pPoool;//当前的内存块属于哪一个内存池
stMemoryBlock* pNext;//节点指针
bool isInPool;//表示这个内存块是否属于池内存
}MEMORY_BLOCK, * LP_MEMORY_BLOCK;
内存池类的实现
//内存池类
class MemoryPool
{
MemoryPool(const MemoryPool&) = delete;
MemoryPool& operator = (const MemoryPool&) = delete;
public:
MemoryPool();
virtual ~MemoryPool();
//初始化内存池
bool InitPool();
//对池子中申请内存
void* MemAlloc(size_t size);
//从池子中释放内存
void MemFree(void* pMem);
protected:
private:
char* _pPoolBuffer;//整个内存池的内存的指针,指向一大块堆内存
LP_MEMORY_BLOCK _pHeader;//池子中内存块链表的头部
size_t _nSize;//表示的是内存单元的大小
size_t _nBlockCount;//内存单元数量
std::mutex _mutex; //预防在多线程中节点指针的使用
};
内存池的初始化申请内存 内存池链表进行连接
内存池当中的内存块大小 = 单元内存块大小+描述信息(结构体)
bool MemoryPool::InitPool()
{
if (_pPoolBuffer) { return true; }//避免重复的初始化
//计算出需要申请多少内存
//真正的内存块的大小 = 单元内存块大小+描述信息(结构体)
size_t realsize = _nSize + sizeof(MEMORY_BLOCK);
//内存池的大小 = 真正的内存块的大小*内存块数量
size_t bufsize = realsize * _nBlockCount;
//一次性申请一大块内存池内存
_pPoolBuffer = (char*)malloc(bufsize);
if (_pPoolBuff