Here's a compilable version of the program that shows the crash due to the ref. count reaching 0 in the thread. #include <boost/bind.hpp> #include <boost/thread/thread.hpp> #include <time.h> struct Data { Data( void* p ) : ptr( p ) { } boost::shared_ptr<void> ptr; }; void threadA( Data* d ) { boost::shared_ptr<void> ptr( d->ptr ); delete d; // use ptr } class A { public: void init_thread() { Data* data = new Data( this ); boost::thread t( boost::bind( threadA, data ) ); } void sleep() { timespec req; req.tv_sec = 3; req.tv_nsec = 0; nanosleep( &req, NULL ); } }; int main() { A a; a.init_thread(); a.sleep(); return 0; }