面试题:C++ 中 shared_from_this 的作用是什么?它有什么优点?

shared_from_this 是 C++ 标准库中的一个工具,用于在类的成员函数中安全地获取一个指向当前对象的 std::shared_ptr。它通常与 std::enable_shared_from_this 一起使用。


作用

shared_from_this 的主要作用是:

  1. 安全地获取当前对象的 std::shared_ptr
    • 在类的成员函数中,如果需要将当前对象作为 std::shared_ptr 传递给其他函数或存储起来,直接使用 this 指针创建 std::shared_ptr 会导致未定义行为(因为会创建多个独立的 std::shared_ptr,每个都认为自己是唯一的所有者)。
    • shared_from_this 可以返回一个与当前对象关联的、已经存在的 std::shared_ptr,避免重复创建。
  2. 避免手动管理 std::shared_ptr 的生命周期
    • 使用 shared_from_this 可以确保对象的生命周期由 std::shared_ptr 自动管理,避免手动管理带来的错误。

优点

  1. 避免未定义行为
    • 直接使用 std::shared_ptr<T>(this) 会导致多个独立的 std::shared_ptr 管理同一个对象,最终可能导致重复释放内存。
    • shared_from_this 确保所有 std::shared_ptr 共享同一个控制块,避免重复释放。
  2. 简化代码
    • 提供了一种标准化的方式来获取当前对象的 std::shared_ptr,避免了手动创建和管理 std::shared_ptr 的复杂性。
  3. 支持多态
    • std::enable_shared_from_this 是一个模板类,可以与派生类一起使用,支持多态行为。

使用示例

#include <iostream>
#include <memory>

class MyClass : public std::enable_shared_from_this<MyClass> {
public:
    void doSomething() {
        // 获取当前对象的 shared_ptr
        std::shared_ptr<MyClass> self = shared_from_this();
        std::cout << "Use count: " << self.use_count() << std::endl;
    }
};

int main() {
    std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();
    obj->doSomething(); // 输出 Use count: 2
    return 0;
}
  • 在这个例子中,MyClass 继承自 std::enable_shared_from_this<MyClass>
  • 在 doSomething 中,通过 shared_from_this 获取当前对象的 std::shared_ptr,并输出引用计数。

注意事项

  1. 对象必须由 std::shared_ptr 管理
    • 只有在对象已经被 std::shared_ptr 管理的情况下,才能调用 shared_from_this。否则会抛出 std::bad_weak_ptr 异常。
  2. 避免在构造函数中调用
    • 在构造函数中调用 shared_from_this 是未定义行为,因为此时对象尚未被 std::shared_ptr 管理。
  3. 性能开销
    • shared_from_this 会引入一些额外的性能开销,因为它需要访问 std::shared_ptr 的控制块。

总结

  • shared_from_this 的主要作用是安全地获取当前对象的 std::shared_ptr,避免未定义行为和重复释放内存。
  • 它的优点包括避免未定义行为、简化代码和支持多态。
  • 使用时需要注意对象必须由 std::shared_ptr 管理,并且不能在构造函数中调用。

这个问题考察的是对 C++ 智能指针和对象生命周期的理解,尤其是 std::shared_ptr 和 std::enable_shared_from_this 的使用场景。

THE END
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容