当前位置: 首页 > news >正文

侯捷C++课程学习笔记:详解智能指针(三)

侯捷C++课程学习笔记:详解智能指针(三)

一、智能指针核心机制

在这里插入图片描述

1. 共享所有权模型

  • 引用计数原理:通过原子计数器实现多对象共享资源,计数器归零时自动释放内存
  • 控制块结构:包含引用计数与弱引用计数,存储删除器和分配器信息
  • 线程安全保证:引用计数操作为原子操作,但资源访问需额外同步机制

2. 循环引用破解方案

  • 弱引用指针weak_ptr观察但不拥有资源,打破shared_ptr的循环依赖
  • 交叉引用检测:父对象持有子对象的shared_ptr,子对象使用weak_ptr指向父对象
  • 典型应用场景:GUI组件树、缓存系统、观察者模式实现

二、高级用法解析

1. 自定义删除器

  • 函数对象支持:支持函数指针、lambda表达式或自定义仿函数
  • 特殊资源管理:适配文件句柄(fclose)、网络连接(closesocket)等非内存资源
  • 删除器存储策略:控制块中保存类型擦除后的删除器副本

2. 性能优化技巧

  • make_shared优势:合并控制块与对象内存分配,提升局部性原理
  • 别名构造方法shared_ptr<T>(existing_ptr, ptr)共享控制块管理不同对象
  • 弱引用提升优化:weak_ptr::lock()原子操作保证线程安全

三、特殊场景处理

1. 多态对象管理

  • 基类析构规范:必须声明虚析构函数保证正确释放派生类资源
  • enable_shared_from_this:解决构造函数内获取shared_ptr的循环问题
  • 向下转型安全:使用dynamic_pointer_cast进行运行时类型检查

2. 异步编程支持

  • 线程间传递策略shared_ptr跨线程传递需保证原子性引用计数
  • 弱引用保活机制:任务队列中存储weak_ptr防止意外延长对象生命周期
  • 析构时机控制:通过自定义删除器延迟资源释放至安全时刻

四、工程实践指南

1. 设计模式应用

  • 工厂模式:返回unique_ptr保持创建者所有权
  • 观察者模式:观察者持有weak_ptr避免影响主题生命周期
  • 享元模式shared_ptr管理共享元对象池

2. 内存泄漏防护

  • 环形引用检测工具:Valgrind、Visual Studio诊断工具链
  • 资源泄漏检查表:
    • 检查所有退出路径的引用释放
    • 验证自定义删除器的正确性
    • 监控控制块内存泄漏

五、现代演进方向

  • intrusive_ptr:嵌入式引用计数,适用于已有计数机制的对象
  • polymorphic_allocator:C++17引入的分配器适配机制
  • atomic_shared_ptr:C++20提供的线程安全共享指针
智能指针体系
独占式指针
共享式指针
观察式指针
unique_ptr
shared_ptr
weak_ptr
引用计数
控制块
提升操作

附录:关键用法示例

// 自定义删除器示例
struct FileDeleter {
    void operator()(FILE* fp) const {
        if(fp) fclose(fp);
    }
};
std::shared_ptr<FILE> logFile(fopen("app.log", "w"), FileDeleter{});

// 弱引用破解循环引用
class Controller {
    std::vector<std::shared_ptr<Device>> devices;
};

class Device {
    std::weak_ptr<Controller> parentCtrl;
};

相关文章:

  • Feign中@RequestBody 与 @RequestParam 的区别
  • Vue3:组件通信方式
  • 暴力破解Excel受保护的单元格密码
  • 大数据学习(59)-DataX执行机制
  • 云原生性能测试全解析:如何构建高效稳定的现代应用?
  • 【数据结构】-哈夫曼树以及其应用
  • 基于ESP32的桌面小屏幕实战[8]:任务创建
  • package.json 依赖包约束及快速删除node_modules
  • 【GOOGLE插件】chrome.runtime.sendNativeMessage与本地应用交互
  • 爬虫案例十三js逆向模拟登录中大网校
  • 使用OpenCV和MediaPipe库——抽烟检测(姿态监控)
  • 【大模型技术】怎么用agent和prompt工程实现用户的要求?
  • c++ 中的float和double 的区别 开发过程中使用哪个更好
  • Centos离线安装perl
  • 高速PCB设计(布线设计)
  • React Next项目中导入Echart世界航线图 并配置中文
  • 本地算力部署大模型详细流程(一)
  • 机器学习_特征工程
  • 计算机网络-网络规划与设计
  • unity基础——线段与拖尾
  • 上海徐汇 “家 + 书屋”,创新服务广大家庭
  • 江苏疾控:下设部门无“病毒研究所”,常荣山非本单位工作人员
  • 义乌至迪拜“铁海快线+中东快航”首发,物流成本降低18%
  • 私家车跑“顺风”出事故,意外险赔不赔?
  • 中国驻美大使:远离故土的子弹库帛书正随民族复兴踏上归途
  • 上海市第二十届青少年科技节启动:为期半年,推出百余项活动