C++面试题更新 2026-08-05

请说明 C++ 标准库中 auto_ptr、unique_ptr、shared_ptr 和 weak_ptr 这几类智能指针各自适用的典型场景,并比较它们的所有权模型和常见用法。

技术原理方案权衡C++

考察说明

考查对 C++ 智能指针所有权语义和适用场景的理解

回答思路

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