C++ 智能指针与内存管理面试题

1. C++11的三种智能指针是什么?

答案:

  • unique_ptr独占所有权,不能拷贝,只能移动轻量级,无额外开销适合明确单一所有者的场景
  • shared_ptr共享所有权,引用计数最后一个shared_ptr销毁时释放资源有引用计数开销
  • weak_ptr不控制对象生命周期配合shared_ptr使用解决循环引用问题
  • 已废弃auto_ptr:C++11已废弃,被unique_ptr替代

2. shared_ptr的实现原理是什么?

答案:

  • 引用计数维护一个控制块,存储引用计数每次拷贝,引用计数+1每次析构,引用计数-1计数为0时释放资源
  • 控制块内容强引用计数(shared_ptr数量)弱引用计数(weak_ptr数量)删除器分配器
  • 线程安全引用计数的增减是线程安全的(原子操作)但对象本身的访问不是线程安全的
  • 性能开销额外的内存(控制块)原子操作的开销间接访问的开销

3. unique_ptr和shared_ptr的区别?

答案:

  • 所有权unique_ptr:独占,不能拷贝shared_ptr:共享,可以拷贝
  • 性能unique_ptr:无额外开销,和原始指针一样shared_ptr:有引用计数开销
  • 使用场景unique_ptr:明确单一所有者,工厂函数返回值shared_ptr:多个所有者,不确定谁最后释放
  • 转换unique_ptr可以转换为shared_ptrshared_ptr不能转换为unique_ptr
  • 数组支持unique_ptr支持数组:unique_ptr<int[]>shared_ptr需要自定义删除器

4. weak_ptr的作用是什么?

答案:

  • 主要作用打破shared_ptr的循环引用观察对象但不影响生命周期临时访问shared_ptr管理的对象
  • 使用方法从shared_ptr构造使用lock()获取shared_ptr使用expired()检查对象是否存在
  • 循环引用示例
struct Node {    shared_ptr<Node> next;  // 循环引用    weak_ptr<Node> prev;    // 使用weak_ptr打破};
  • 注意事项weak_ptr不能直接访问对象必须先转换为shared_ptr对象可能已被销毁

5. 如何自定义智能指针的删除器?

答案:

  • unique_ptr的删除器
auto deleter = [](FILE* fp) { fclose(fp); };unique_ptr<FILE, decltype(deleter)> fp(fopen("file.txt", "r"), deleter);
  • shared_ptr的

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务