尝试理解 std::enable_shared_from_this<T> 但导致 bad_weak_ptr 使用它
Try to understand std::enable_shared_from_this<T> but cause a bad_weak_ptr using it
我试图理解 std::enable_shared_from_this class 的行为,但我无法理解。
所以我写了一个简单的程序来测试不同的情况。
问题
谁能解释一下下面代码的行为,因为我无法解释观察到的结果。
谢谢你的帮助。
代码
#include <iostream>
#include <memory>
struct C : std::enable_shared_from_this<C> { };
int main () {
{//test 1
std::shared_ptr<C> foo, bar;
foo = std::make_shared<C>();
bar = foo->shared_from_this(); //ok
std::cout<<"shared_ptr : ok"<<std::endl;
}
{//test 2
std::shared_ptr<C> foo = std::shared_ptr<C>(new C);
std::shared_ptr<C> bar;
bar = foo->shared_from_this(); //ok
std::cout<<"shared_ptr + New : ok"<<std::endl;
}
{//test 3
C* foo = new C;
std::shared_ptr<C> bar;
bar = foo->shared_from_this(); //throw std::bad_weak_ptr
std::cout<<"New : ok"<<std::endl;
}
{//test 4 (should make a invalid free of something like that)
C foo;
std::shared_ptr<C> bar;
bar = foo.shared_from_this();//throw std::bad_weak_ptr
std::cout<<"local : ok"<<std::endl;
}
return 0;
}
这是输出:
shared_ptr : ok
shared_ptr + New : ok
terminate called after throwing an instance of 'std::bad_weak_ptr'
what(): bad_weak_ptr
构建信息
- 系统:Windows 7 x64
- 编译器:mingw 4.9.2 x64
如果我从原始的 boost 文档中没记错的话,"There must exist at least one shared_ptr instance p that owns t"。对于情况 3 和 4,您调用 shared_from_this().
的点不存在
enable_shared_from_this
的合同是当您调用 shared_from_this()
如果 对象由 shared_ptr
。如果尚未被管理,它无法自行创建 shared_ptr
。
您已经在上一个测试用例中弄清楚为什么允许 shared_from_this()
为您创建共享指针是个坏主意...
我试图理解 std::enable_shared_from_this class 的行为,但我无法理解。 所以我写了一个简单的程序来测试不同的情况。
问题
谁能解释一下下面代码的行为,因为我无法解释观察到的结果。
谢谢你的帮助。
代码
#include <iostream>
#include <memory>
struct C : std::enable_shared_from_this<C> { };
int main () {
{//test 1
std::shared_ptr<C> foo, bar;
foo = std::make_shared<C>();
bar = foo->shared_from_this(); //ok
std::cout<<"shared_ptr : ok"<<std::endl;
}
{//test 2
std::shared_ptr<C> foo = std::shared_ptr<C>(new C);
std::shared_ptr<C> bar;
bar = foo->shared_from_this(); //ok
std::cout<<"shared_ptr + New : ok"<<std::endl;
}
{//test 3
C* foo = new C;
std::shared_ptr<C> bar;
bar = foo->shared_from_this(); //throw std::bad_weak_ptr
std::cout<<"New : ok"<<std::endl;
}
{//test 4 (should make a invalid free of something like that)
C foo;
std::shared_ptr<C> bar;
bar = foo.shared_from_this();//throw std::bad_weak_ptr
std::cout<<"local : ok"<<std::endl;
}
return 0;
}
这是输出:
shared_ptr : ok
shared_ptr + New : ok
terminate called after throwing an instance of 'std::bad_weak_ptr'
what(): bad_weak_ptr
构建信息
- 系统:Windows 7 x64
- 编译器:mingw 4.9.2 x64
如果我从原始的 boost 文档中没记错的话,"There must exist at least one shared_ptr instance p that owns t"。对于情况 3 和 4,您调用 shared_from_this().
的点不存在enable_shared_from_this
的合同是当您调用 shared_from_this()
如果 对象由 shared_ptr
。如果尚未被管理,它无法自行创建 shared_ptr
。
您已经在上一个测试用例中弄清楚为什么允许 shared_from_this()
为您创建共享指针是个坏主意...