+-

参见英文答案 > std::enable_shared_from_this: is it allowed to call shared_from_this() in destructor? 4个
不知怎的,在调用p-> start()之后 – shared_from_this会抛出bad_weak_ptr.
但正如您可以看到在完全启动shared_ptr之后调用的p-> start().
不知怎的,在调用p-> start()之后 – shared_from_this会抛出bad_weak_ptr.
但正如您可以看到在完全启动shared_ptr之后调用的p-> start().
struct A : std::enable_shared_from_this<A>
{
std::thread* t = nullptr;
A() {}
~A(){
t->join();
delete t;
}
void f() {
try{
auto p = this->shared_from_this();
std::cout << "p:" << p.get() << "\n";
} catch(...) {
std::cout << "Exception !!!\n";
}
}
void start() {
t = new std::thread(&A::f,this);
}
};
std::shared_ptr<A> create() {
A* a = new A();
std::shared_ptr<A> p(a);
p->start();
return p;
}
int main()
{
int i = 0;
std::map<int,std::shared_ptr<A>> map;
while( i < 1024) {
auto ptr = create();
map[i++] = ptr;
}
return 0;
}
link to working code (coliru) – unexplained bad_weak_ptr – exception is thrown …
最佳答案
您的问题是您在加入时遇到竞争条件. main可能正在退出,破坏地图中的对象.地图中的shared_ptr被销毁,调用你想要加入的对象的析构函数,但为时已晚:enable_shared_from_this想要使用的shared_ptr是toast.然后(竞争条件)在对象自己的线程中,它试图在死亡的weak_ptr上从此获得共享,这会导致抛出异常并在cout上打印消息.
点击查看更多相关文章
转载注明原文:c – 从另一个线程调用shared_from_this但在shared_ptr初始化之后获取bad_weak_ptr - 乐贴网