c++ 簡單實現一個管理對象池
ObjPool.h
#pragma once
#include <iostream>
#include <queue>
#include <memory>
using namespace std;
static constexpr int32_t pool_step = 3;
template<typename T>
class ObjPool
{
using shared_obj_t = shared_ptr<T>;
using pool_t = typename deque<shared_obj_t>;
public:
// 程序啓動優先調用此函數
static ObjPool<T>* Instance()
{
static ObjPool<T> pool;
return &pool;
}
~ObjPool()
{
m_pool.clear();
}
template<typename... Args>
void Init(Args&&... args)
{
m_count += pool_step;
for (int32_t i=0;i< pool_step;i++)
{
auto pObj = shared_ptr<T>(new T(std::forward<Args>(args)...),[this](T* obj) {
obj->Clear();
m_pool.emplace_back(shared_ptr<T>(obj));
});
m_pool.emplace_back(pObj);
}
}
template<typename... Args>
shared_obj_t GetObj(Args&&... args)
{
if (m_pool.empty())
{
Init(args...);
}
auto obj = m_pool.front();
m_pool.pop_front();
return obj;
}
int32_t EmptySize()
{
return m_pool.size();
}
int32_t UseSize()
{
return (m_count - m_pool.size());
}
private:
pool_t m_pool;
int32_t m_count{0};
};
測試代碼:
#include "ObjPool.h"
class User
{
public:
User() {}
~User() {}
void Clear()
{
cout << "clear user resource" << endl;;
}
private:
};
class User2
{
public:
User2() {}
User2(const std::string& str):m_str(str) {}
~User2() {}
void Clear()
{
cout << "clear user resource" << endl;
cout << "str ==" << m_str << endl;
}
private:
std::string m_str;
};
int main()
{
auto user_pool = ObjPool<User>::Instance();
auto pUser = user_pool->GetObj();
pUser = nullptr;
cout << user_pool->EmptySize() << endl;
auto pUser1 = user_pool->GetObj();
auto pUser2 = user_pool->GetObj();
auto pUser3 = user_pool->GetObj();
auto pUser4 = user_pool->GetObj();
cout << user_pool->EmptySize() << endl;
cout << user_pool->UseSize() << endl;
auto user2_pool = ObjPool<User2>::Instance();
auto pUser5 = user2_pool->GetObj("AAAA");
pUser5 = nullptr;
return 0;
}