To me it seems like a bug, that the weak_count in counted_base::release is decremented before the call to dispose. See below //source code begin void release() // nothrow { long new_use_count; long new_weak_count; { #ifdef BOOST_HAS_THREADS mutex_type::scoped_lock lock(mtx_); #endif new_use_count = --use_count_; new_weak_count = --weak_count_; //this is a bug } if(new_use_count == 0) { dispose(); //the this object may be deleted here } if(new_weak_count == 0) { // not a direct 'delete this', because the inlined // release() may use a different heap manager self_deleter_(this); } } //source code end If the call to dispose() indirectly calls weak_release there is an error as weak_release will decrement the --weak_count and may destruct the counted_base object. This will happen if you have an class C with a member of type weak_ptr<C>. As I see it the decrement of weak_count should be moved to after the dispose call. see below: //source code begin void release() // nothrow { long new_use_count; long new_weak_count; { #ifdef BOOST_HAS_THREADS mutex_type::scoped_lock lock(mtx_); #endif new_use_count = --use_count_; //do not decrement weak_count here } if(new_use_count == 0) { dispose(); } { #ifdef BOOST_HAS_THREADS mutex_type::scoped_lock lock(mtx_); #endif new_weak_count = --weak_count_; } if(new_weak_count == 0) { // not a direct 'delete this', because the inlined // release() may use a different heap manager self_deleter_(this); } } //source code end ????