对象池的核心目标是复用资源,减少频繁创建和销毁的开销。1. 通过定制删除器,shared_ptr 在引用计数归零时不释放内存而是将对象放回池中;2. 对象池结构包含存储容器、删除器、获取和释放方法;3. 需注意避免裸指针误删、线程安全、池大小限制及构造参数支持等细节;4. 实现方式兼顾安全与性能,适合高频场景但需处理状态重置和并发问题。

对象池的核心目标是复用资源,减少频繁创建和销毁的开销。用 C++ 的 shared_ptr 实现对象池时,关键在于定制删除器:当引用计数归零时,不是直接释放内存,而是把对象“放回池中”。

默认情况下,shared_ptr 在最后一个引用失效时会调用 delete。但对象池希望这个对象不被真正删除,而是回收到池里等待下次使用。

这时候就需要一个自定义的删除器函数(或仿函数),告诉 shared_ptr:
“别删了它,把它还给我。”
这样就能控制对象生命周期,实现复用。
一个简单的对象池可以包含以下几个部分:
std::stack<T*>)举个例子:
template <typename T>
class ObjectPool {
public:
using Deleter = std::function<void(T*)>;
// 池内回收对象的删除器
static void returnToPool(T* ptr) {
instance()._pool.push(ptr);
}
// 获取一个对象,如果池里有就复用,没有就新建
shared_ptr<T> get() {
if (_pool.empty()) {
return shared_ptr<T>(new T, returnToPool);
} else {
T* obj = _pool.top();
_pool.pop();
return shared_ptr<T>(obj, returnToPool);
}
}
private:
std::stack<T*> _pool;
static ObjectPool& instance() {
static ObjectPool pool;
return pool;
}
};这种方式让每次获取的对象都带上了“回收逻辑”,只要没人用了,就会自动回到池里。
避免裸指针误删
shared_ptr,否则用户可能手动 delete 导致崩溃。线程安全问题
stack 和 shared_ptr 的操作都需要加锁。get() 和删除器中加互斥锁保护 _pool 的访问。池的大小限制
构造参数支持
new T(...)。优点:
缺点:
基本上就这些。用 shared_ptr 加定制删除器来实现对象池,是一种兼顾安全和性能的做法,虽然细节上要注意点,但一旦搭好,后续使用很省心。
以上就是怎样用智能指针实现对象池 使用shared_ptr定制删除器实现资源复用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号