您现在的位置是:主页 > news > 天津单位网站建设/百度搜索风云榜小说排行榜
天津单位网站建设/百度搜索风云榜小说排行榜
admin2025/6/1 16:34:04【news】
简介天津单位网站建设,百度搜索风云榜小说排行榜,wordpress 调试,河南郑州暴雨版本2 的问题 1.对象如果没有归还给对象池,对象无法销毁。 2.对象如果在对象池外释放,对象池无法感知。 版本3 设计: 通过自动回收用完的对象来解决。这里用智能指针就可以解决,在创建智能指针时可以指定删除 器,在删除…
天津单位网站建设,百度搜索风云榜小说排行榜,wordpress 调试,河南郑州暴雨版本2 的问题 1.对象如果没有归还给对象池,对象无法销毁。 2.对象如果在对象池外释放,对象池无法感知。 版本3 设计: 通过自动回收用完的对象来解决。这里用智能指针就可以解决,在创建智能指针时可以指定删除 器,在删除…
版本2 的问题
1.对象如果没有归还给对象池,对象无法销毁。
2.对象如果在对象池外释放,对象池无法感知。
版本3
设计:
通过自动回收用完的对象来解决。这里用智能指针就可以解决,在创建智能指针时可以指定删除 器,在删除器中不删除对象,而是将其回收到对象池中。这个过程对外界来说是看不见的,由智能指针 自己完成。
使用C11 的智能指针管理对象的生存期,重写删除器,使删除器与对象池结合;
// 简单日志
#define LOG(info) \cout << __FILE__ << ":" << __LINE__ << " " \<< __TIMESTAMP__ << " : " << info << endl;
const int MaxTotal = 10; // 池对象总数
const int MaxIdle = 10; // 最大空闲对象数
const int MinIdle = 0; // 最小空闲对象数
template<class T>
class ObjectPool
{
private:class ObjectDeleter{ObjectPool* _pool;public:ObjectDeleter(ObjectPool* p) :_pool(p) {}void operator()(T* pobj) const{if (_pool->needClose){delete pobj;}else{//if (std::erase_if(_pool->m_active_object_queue, [pobj](shared_ptr<T>& p)// {return p.get() == pobj;// }//)){LOG("对象已经归还");_pool->m_idle_object_queue.emplace_back(std::shared_ptr<T>(pobj,ObjectDeleter(_pool)));}_pool->numActive -= 1;}}};
private://bool needClose = false; // 需要关闭标记//int numActive = 0; //活动对象个数//int createCount = 0; // 创建对象个数//int destroyCount = 0; // 销毁对象个数bool needClose; // 需要关闭标记int numActive; //活动对象个数int createCount; // 创建对象个数int destroyCount; // 销毁对象个数std::deque<std::shared_ptr<T> > m_active_object_queue; // 活动队列,借出对象存储的队列std::deque<std::shared_ptr<T> >m_idle_object_queue; // 空闲队列
public:ObjectPool()
:needClose(false),numActive(0),createCount(0),destroyCount(0) {}ObjectPool(const ObjectPool&) = delete;ObjectPool& operator=(const ObjectPool&) = delete;~ObjectPool(){Close();}void Close() // 关闭对象池{LOG("关闭对象池");needClose = true;Clear();}void Clear() // 清空对象池{//m_active_object_queue.clear();m_idle_object_queue.clear();createCount = 0;}size_t GetNumIdle() const{return m_idle_object_queue.size();}size_t GetNumActive() const{return numActive;}void Init(size_t num){if (needClose){LOG("对象池已关闭");return; //exit(1);}if (num <= 0 || num > MaxTotal){LOG("对象数量超出范围");exit(1);}createCount += num;for (size_t i = 0; i < num; ++i){//shared_ptr<T> sp = shared_ptr<T>(newT(),ObjectDeleter(this));//m_idle_object_queue.push_back(sp);m_idle_object_queue.push_back(shared_ptr<T>(new T(),ObjectDeleter(this)));}}
public:void AddObject(){Init(1);}std::shared_ptr<T> borrowObject() //借对象{if (needClose){LOG("对象池已关闭,无法借对象");return nullptr;}if (m_idle_object_queue.size() == 0){LOG("空袭队列空,无对象可借");if (createCount - numActive - destroyCount >= MaxTotal){LOG("对象池中对象的个数已到达上限");return nullptr; // exit(1);}AddObject();LOG("增加对象成功");}shared_ptr<T> sp = m_idle_object_queue.front();m_idle_object_queue.pop_front();//m_active_object_queue.push_back(sp);numActive += 1;return sp;}void returnObject(std::shared_ptr<T> &sp){sp.reset();}
};
// 测试
int main()
{std::shared_ptr<Point> ps1;std::shared_ptr<Point> ps2;{ObjectPool<Point> objpool;objpool.Init(2);ps1 = objpool.borrowObject();ps2 = objpool.borrowObject();std::shared_ptr<Point> ps3 = objpool.borrowObject();std::shared_ptr<Point> ps4 = objpool.borrowObject();cout << "block end" << endl;}//std::shared_ptr<Point> ps5 = objpool.borrowObject();return 0;
}