MST

星途 面试题库

面试题:C++ 中智能指针的分类及区别

请简要介绍 C++ 中 std::unique_ptr、std::shared_ptr 和 std::weak_ptr 这三种智能指针的特点、适用场景以及它们之间的主要区别。
26.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

std::unique_ptr

  • 特点
    • 独占式拥有资源,同一时间只有一个 std::unique_ptr 可以指向给定对象。
    • 资源所有权转移时高效,移动构造和移动赋值操作代价低。
    • 不能进行拷贝构造和拷贝赋值,只能进行移动操作。
  • 适用场景
    • 当你希望对某个对象拥有绝对控制权,确保对象在其生命周期内只有一个所有者时使用。例如,管理动态分配的数组,std::unique_ptr<int[]>
    • 函数返回动态分配的对象时,使用 std::unique_ptr 可以高效地转移所有权。
  • 与其他智能指针区别
    • std::shared_ptr 相比,std::unique_ptr 不支持共享所有权,没有引用计数开销,更轻量级。
    • std::weak_ptr 相比,std::unique_ptr 是强引用,直接控制对象生命周期,而 std::weak_ptr 是弱引用,不控制对象生命周期。

std::shared_ptr

  • 特点
    • 共享式拥有资源,通过引用计数来管理对象的生命周期。
    • 支持拷贝构造和拷贝赋值,多个 std::shared_ptr 可以指向同一个对象,引用计数增加;当 std::shared_ptr 析构时,引用计数减少。
    • 当引用计数为 0 时,自动释放所指向的对象。
  • 适用场景
    • 当多个对象需要共享同一个资源的所有权时使用,比如在多个模块之间共享一个数据结构。
    • 适用于无法确定对象生命周期结束的场景,由引用计数自动管理。
  • 与其他智能指针区别
    • std::unique_ptr 相比,std::shared_ptr 支持共享所有权,但存在引用计数开销,性能上略低于 std::unique_ptr
    • std::weak_ptr 相比,std::shared_ptr 是强引用,会增加对象的引用计数从而延长对象生命周期,而 std::weak_ptr 是弱引用,不会影响对象生命周期。

std::weak_ptr

  • 特点
    • 弱引用,不控制对象的生命周期,不增加对象的引用计数。
    • 用于解决 std::shared_ptr 的循环引用问题。
    • 可以通过 lock() 方法尝试获取一个 std::shared_ptr,如果对象已被释放,则 lock() 返回空指针。
  • 适用场景
    • 当需要观察 std::shared_ptr 所管理对象,但又不想影响其生命周期时使用,例如实现观察者模式。
    • 用于打破 std::shared_ptr 之间的循环引用,避免内存泄漏。
  • 与其他智能指针区别
    • std::unique_ptrstd::shared_ptr 相比,std::weak_ptr 不直接控制对象生命周期,是一种辅助性的智能指针,用于解决特定场景下的问题,如循环引用。