I’ve seen this several times causing troubles:

boost::shared_ptr<Foo> p(new Foo);
boost::thread t(boost::bind(&Foo::method, p.get()))

This prevents the livecycle management of shared_ptr or any other smart pointer to be effective in the thread. Hence, p may get destructed even though the thread is still active.

Boost bind can handle smart pointers, so instead use the smart pointer itself as the instance argument for bind:

boost::thread t(boost::bind(&Foo::method, p))