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++工程能力.

查看10道真题和解析