首页 > 解决方案 > 为什么调用 shared_from_this 调用 std::terminate

问题描述

考虑这段代码:

class A : public std::enable_shared_from_this<A>
{
public:
     std::shared_ptr<A> f()
     {
          return shared_from_this();
     }
};

int main()
{
    A a;
    std::shared_ptr<A> ptr = a.f();
}

此代码在 Visual Studio 2017 中终止。我想我在这里做错了什么。谁能帮我这个?我想要一个由 shared_from_this() 创建的 shared_ptr。

标签: c++c++11shared-ptrc++17c++-standard-library

解决方案


因为a不是共享指针所拥有的。从cppreference

只允许在先前共享的对象上调用 shared_from_this,即在由 std::shared_ptr 管理的对象上。否则行为未定义(C++17 前)std::bad_weak_ptr 被抛出(由默认构造的weak_this 中的shared_ptr 构造函数)(C++17 起)。


推荐阅读