C++ 简单对象池实现

3,682 阅读3分钟

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后台服务器开发**====