您的位置:首页 >enable_shared_from_this 主要用于在类中安全地获取 this 指针的 shared_ptr,确保对象的生命周期由智能指针管理,避免悬空指针
发布于2026-02-04 阅读(0)
扫一扫,手机访问
当需要在类内部安全获取指向当前对象的std::shared_ptr时应使用std::enable_shared_from_this,因为直接使用std::shared_ptr<T>(this)会创建独立的引用计数导致双重释放;正确做法是让类继承std::enable_shared_from_this<T>并通过std::make_shared创建对象后调用shared_from_this(),从而确保所有返回的shared_ptr共享同一控制块,适用于回调、自引用等场景,且不可在构造函数中或未被shared_ptr管理时调用,否则会抛出异常或导致未定义行为。

当你需要在类的内部安全地获取指向当前对象的 std::shared_ptr 时,就应该使用 enable_shared_from_this。
直接使用 std::make_shared<T>(this) 或者 std::shared_ptr<T>(this) 是错误且危险的,因为这会创建一个新的引用计数,导致多个独立的 shared_ptr 管理同一个对象,最终可能引发双重释放或未定义行为。
enable_shared_from_this 的核心用途是:在对象已经被 shared_ptr 管理的前提下,类内部需要生成指向自身的 shared_ptr。
常见场景包括:
this 作为 shared_ptr 传给其他函数或对象要使用 enable_shared_from_this,类必须:
std::enable_shared_from_this<T>std::shared_ptr 创建shared_from_this() 获取 shared_ptr#include <memory>
#include <iostream>
struct MyClass : std::enable_shared_from_this<MyClass> {
void do_something() {
// 安全地获取指向自身的 shared_ptr
auto self = shared_from_this();
some_other_function(self);
}
void some_other_function(std::shared_ptr<MyClass> ptr) {
std::cout << "Called with shared_ptr\n";
}
};
int main() {
auto obj = std::make_shared<MyClass>(); // 必须用 shared_ptr 创建
obj->do_something(); // 此时 shared_from_this() 才能安全调用
}new 对象然后调用 shared_from_this(),会抛出 std::bad_weak_ptr 异常shared_from_this(),此时对象尚未被 shared_ptr 完全接管shared_ptr 管理shared_from_this() 返回的 shared_ptr 共享同一引用计数MyClass* p = new MyClass; std::shared_ptr<MyClass> ptr1(p); std::shared_ptr<MyClass> ptr2(p); // 危险!两个独立的 shared_ptr 管理同一对象
这样会造成两个独立的控制块,引用计数互不相干,析构时会崩溃。
而 enable_shared_from_this 内部使用 weak_ptr 跟踪对象是否已被 shared_ptr 管理,确保所有 shared_from_this() 返回的指针共享同一个控制块。
基本上就这些。只要记住:想在类内部返回 this 的 shared_ptr,且对象是用 shared_ptr 管理的,就必须用 enable_shared_from_this。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9