shared_from_this与派生类

时间:2017-03-27 12:05:51

标签: c++ inheritance

我正在尝试使用shared_from_this函数创建共享ptr。

#include <iostream>
#include <memory>

class foo {
public:
    virtual void method() {
        std::cerr << "foo::method()" << std::endl;
    }
};

class foo_derived : public foo, public std::enable_shared_from_this<foo> {
public:
    void method() override {
        auto self(shared_from_this());
        std::cerr << "foo_derived::method" << std::endl;
    }
};

int main() {
    foo_derived().method();
}

此代码从第auto self(shared_from_this());行抛出bad_weak_ptr 我认为问题在于self是在派生类中创建的。 我正在寻找这种行为的解释,并且还会感谢使用派生类的有效shared_from_this用法的示例。

1 个答案:

答案 0 :(得分:2)

它与继承无关。以这种方式拨打method代替工作:std::make_shared<foo_derived>()->method();

cppreference std::enable_shared_from_this::shared_from_this

  

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