Somehow after p->start()
is called - shared_from_this
throws bad_weak_ptr
.
But as you can see p->start()
called after shared_ptr
is fully initiated.
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 ...