首页 > 后端开发 > C++ > 正文

怎样用智能指针实现对象池 使用shared_ptr定制删除器实现资源复用

P粉602998670
发布: 2025-08-01 10:18:02
原创
955人浏览过

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

怎样用智能指针实现对象池 使用shared_ptr定制删除器实现资源复用

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

怎样用智能指针实现对象池 使用shared_ptr定制删除器实现资源复用

为什么需要定制删除器?

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

怎样用智能指针实现对象池 使用shared_ptr定制删除器实现资源复用

这时候就需要一个自定义的删除器函数(或仿函数),告诉 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;
    }
};
登录后复制

这种方式让每次获取的对象都带上了“回收逻辑”,只要没人用了,就会自动回到池里。

Felvin
Felvin

AI无代码市场,只需一个提示快速构建应用程序

Felvin 161
查看详情 Felvin

使用时需要注意哪些细节?

  1. 避免裸指针误删

    • 不要对外暴露原始指针,只返回 shared_ptr,否则用户可能手动 delete 导致崩溃。
  2. 线程安全问题

    • 如果多个线程同时访问对象池,stackshared_ptr 的操作都需要加锁。
    • 可以在 get() 和删除器中加互斥锁保护 _pool 的访问。
  3. 池的大小限制

    • 可以设置最大容量,超过上限再释放内存,而不是无限制增长。
    • 也可以定期清理空闲对象,节省资源。
  4. 构造参数支持

    • 上面的例子只能默认构造对象,若想传递参数,可以用工厂方法封装 new T(...)

这样做有什么好处和限制?

优点:

  • 管理方便:靠智能指针自动触发回收逻辑,不用手动跟踪谁在用哪个对象。
  • 性能提升:减少动态分配次数,适合高频创建销毁的场景,比如网络连接、数据库连接等。

缺点:

  • 实现复杂一些,特别是要考虑线程安全。
  • 对象状态不清空,复用前需要重置,否则可能出现残留数据影响新用途。

基本上就这些。用 shared_ptr 加定制删除器来实现对象池,是一种兼顾安全和性能的做法,虽然细节上要注意点,但一旦搭好,后续使用很省心。

以上就是怎样用智能指针实现对象池 使用shared_ptr定制删除器实现资源复用的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号