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

在 C++ 中,unique_ptr 的实现原理是什么?请详细说明。

技术原理C++

考察说明

考查对 C++11 智能指针 unique_ptr 底层机制的理解,包括所有权、移动语义和析构行为。

回答思路

  1. 【回答框架 1】unique_ptr 是 C++11 引入的独占所有权智能指针,通过模板类实现,内部持有原始指针,并在析构时自动 delete。它禁止拷贝构造和拷贝赋值,保证同一时间只有一个 unique_ptr 拥有该资源。
  2. 【回答框架 2】所有权转移通过移动语义实现,移动构造函数和移动赋值运算符将内部指针转移给目标对象,并将源对象置空。这避免了拷贝带来的资源重复释放问题。
  3. 【回答框架 3】释放行为通过删除器(deleter)管理,默认使用 delete,但可以自定义删除器以支持特殊资源(如文件句柄)。删除器在析构时被调用,确保资源正确释放。
  4. 【回答框架 4】unique_ptr 的常见实现包括一个指针成员和删除器(可能使用空基类优化(EBO)减少内存占用),这使得其大小通常与裸指针相当,效率高。
  5. 【回答框架 5】使用时需要注意,unique_ptr 不提供共享所有权,不能直接作为函数参数按值传递(除非使用移动),但可以作为返回值通过移动语义转移所有权。
  6. 【关键点 1】unique_ptr 独占所有权,不可拷贝,只能移动。
  7. 【关键点 2】移动转移所有权,源指针置空。
  8. 【关键点 3】默认删除器为 delete,支持自定义删除器。
  9. 【关键点 4】通常与裸指针大小相同,性能开销可忽略。
  10. 【关键点 5】正确使用可避免内存泄漏和悬垂指针。
  11. 【易错点 1】误用 unique_ptr 进行拷贝导致编译错误。
  12. 【易错点 2】忘记自定义删除器可能导致资源泄漏(如非 new 分配的资源)。
  13. 【易错点 3】将裸指针从 unique_ptr 中取出后双重释放。