shared_ptr 和 weak_ptr 失败的小案例
Trivial cases of shared_ptr and weak_ptr failing
我在使用 shared_ptr
和 weak_ptr
以及 enable_shared_from_this
时遇到问题。
当我 google 我所看到的症状时,每个人都建议“当没有 shared_ptr
实例拥有您的对象时,您不能使用 shared_from_this()
。
但我不是这样。
考虑这段代码:
#include <memory>
#include <cassert>
class MyClass : std::enable_shared_from_this<MyClass>
{
public:
void this_fails()
{
// Doesn't even assert(), because it throws bad_weak_ptr
assert(shared_from_this());
}
void this_fails_too()
{
std::weak_ptr<MyClass> weak = weak_from_this();
std::shared_ptr<MyClass> strong = weak.lock();
// This assert fails
assert(strong.get());
}
};
int main()
{
std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();
obj->this_fails();
obj->this_fails_too();
}
MyClass
中的两种方法都会使程序崩溃。我一定是遗漏了一些明显的东西 - 它是什么?
您必须公开继承std::enable_shared_from_this
。私有继承没有帮助 - std::shared_ptr
无法访问基础 class 并正确设置它。
您必须公开继承 std::enable_shared_from_this
才能使其正常工作。
我在使用 shared_ptr
和 weak_ptr
以及 enable_shared_from_this
时遇到问题。
当我 google 我所看到的症状时,每个人都建议“当没有 shared_ptr
实例拥有您的对象时,您不能使用 shared_from_this()
。
但我不是这样。
考虑这段代码:
#include <memory>
#include <cassert>
class MyClass : std::enable_shared_from_this<MyClass>
{
public:
void this_fails()
{
// Doesn't even assert(), because it throws bad_weak_ptr
assert(shared_from_this());
}
void this_fails_too()
{
std::weak_ptr<MyClass> weak = weak_from_this();
std::shared_ptr<MyClass> strong = weak.lock();
// This assert fails
assert(strong.get());
}
};
int main()
{
std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();
obj->this_fails();
obj->this_fails_too();
}
MyClass
中的两种方法都会使程序崩溃。我一定是遗漏了一些明显的东西 - 它是什么?
您必须公开继承std::enable_shared_from_this
。私有继承没有帮助 - std::shared_ptr
无法访问基础 class 并正确设置它。
您必须公开继承 std::enable_shared_from_this
才能使其正常工作。