C++ 简单对象池实现
一、前言
C++内存管理可谓是让程序员操碎了心,前面写了C++内存池设计与实现和
C++智能指针,这次该是大家经常听说的对象池了;
什么是对象池
所谓对象池就是有很多对象的池子,其实也就是开始创建大量的对象放在一个池子里面;这不免让我想起了后宫佳丽三千人呀!我们可以将后宫比作一个池子,这三千佳丽就是三千个对象,这三千佳丽住在后宫,也就是在对象池中有三千个对象;
对象池的作用
我们还用着后宫佳丽三千人来做比较;
第一种情况:皇帝需要一个妃子就让侍卫和大臣去纳妃,这一次就可能要好久,这些侍卫和大臣不免要面临砍头抄家的风险呀!关键每次皇帝每次纳妃之后,就把妃子逐出了皇宫,这样每次纳妃再逐出去,皇帝心累,侍卫和大臣每次也是在墙角瑟瑟发抖呀!
**第二种情况:**这种情况就好很多了,侍卫和大臣一次性就为皇帝纳了3000人并且入住后宫,皇帝需要妃子的时候,从后宫抓一个出来,不需要在放进去,这样,侍卫和大臣没有了砍头的风险,皇帝也很愉快,效率变高了好多;
通过上面两种说法,我们会发现,采用对象池的方式,会使对象在申请和释放时更加的高效和方便;
二、对象池实现思路
C++ STL为我们提供了大量的数据结构供我们使用,我们可以采用其中某种数据结构就可以轻松的实现对象池
采用链表的方式:
假设我们创建了一个对象池中有五个对象;
获取对象
为了防止冲突,每次我们获取对象的时候,我们会从链表的头进行获取,然后将头删除
回收对象
与获取对象相同,回收对象时,将对象加入到对象池的尾部,这样就不会和获取对象有所冲突;
这次是做的简单的对象池,其实有很多缺陷:
- 对象池中没有对象时,应该另外申请对象,释放对象的时候,应该区分直接释放和回收内存池,可参考C++内存池设计与实现;
- 释放回收比较麻烦,而且容易造成内存泄漏;
这些缺陷其实有很多解决办法,就不一一说了,只是提供思路;
三、对象池实现测试代码
对象池实现代码
#ifndef _OBJECTPOOL_HPP_
#define _OBJECTPOOL_HPP_
#include <iostream>
#include <list>
template<class Object>
class ObjectPool
{
public:
ObjectPool(size_t Size)
{
_nSize = Size;
for (size_t n = 0; n < _nSize; n++)
{
_mPool.push_back(new Object());
}
}
virtual ~ObjectPool()
{
auto iter = _mPool.begin();
while (iter != _mPool.end())
{
delete *iter;
++iter;
}
_nSize = 0;
}
Object* GetObject()
{
Object* pObj = NULL;
if (_nSize == 0)
{
pObj = new Object();
}
else
{
pObj = _mPool.front();
_mPool.pop_front();
--_nSize;
}
return pObj;
}
void ReturnObject(Object* pObj)
{
_mPool.push_back(pObj);
++_nSize;
}
private:
size_t _nSize;
std::list<Object*> _mPool;
};
#endif // !_OBJECTPOOL_HPP_
对象池测试代码
#include "ObjectPool.hpp"
using namespace std;
class Test
{
public:
Test() {}
~Test() {}
void Print()
{
cout << "Test" << endl;
}
};
int main()
{
ObjectPool<Test> obj(10);
Test* pA;
pA = obj.GetObject();
pA->Print();
obj.ReturnObject(pA);
return 0;
}
往期精彩文章
想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:====**CPP后台服务器开发**====