+-
c – 从另一个线程调用shared_from_this但在shared_ptr初始化之后获取bad_weak_ptr
参见英文答案 > 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().

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 - 乐贴网