侯捷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提供的线程安全共享指针
附录:关键用法示例
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;
};