请说明 C++ 标准库中 auto_ptr、unique_ptr、shared_ptr 和 weak_ptr 这几类智能指针各自适用的典型场景,并比较它们的所有权模型和常见用法。
考察说明
考查对 C++ 智能指针所有权语义和适用场景的理解
回答思路
- 【回答框架 1】智能指针是管理动态内存的 RAII 封装,核心是所有权模型。unique_ptr 独占所有权,不可拷贝但可移动,适合资源所有权唯一、需要明确转移的场景,如工厂函数返回对象、容器存储多态对象。
- 【回答框架 2】shared_ptr 通过引用计数共享所有权,适合多个对象共同拥有同一资源、生命周期不确定的场景,如观察者模式、图结构中的共享节点。但引用计数有线程安全开销和循环引用问题。
- 【回答框架 3】weak_ptr 是 shared_ptr 的弱引用,不增加引用计数,用于打破循环引用,或临时查看资源是否存活,如缓存、观察者列表。lock() 返回 shared_ptr 确保安全访问。
- 【回答框架 4】auto_ptr 是 C++98 的旧版独占指针,其拷贝会转移所有权,容易导致悬垂或误用,C++11 起被 unique_ptr 取代,不应在新的代码中使用。
- 【关键点 1】unique_ptr 表示独占所有权,支持移动语义,使用 move 转移所有权。
- 【关键点 2】shared_ptr 使用引用计数实现共享所有权,但循环引用会导致资源泄漏,配合 weak_ptr 打破。
- 【关键点 3】weak_ptr 不拥有资源,lock() 尝试获取 shared_ptr 以避免悬垂。
- 【关键点 4】auto_ptr 已废弃,其拷贝语义导致所有权意外转移,应使用 unique_ptr 替代。
- 【易错点 1】不能将 shared_ptr 的循环引用误认为会被自动回收,必须用 weak_ptr 打破。
- 【易错点 2】不要从普通裸指针创建多个 shared_ptr,这会导致重复释放。
- 【易错点 3】在性能敏感场景,shared_ptr 的原子计数操作开销可能超过手动的内存管理。