我正在尝试使用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用法的示例。
答案 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)。