class B
{
list<weak_ptr<a> > alist;
void SetA(shared_ptr<A> a){/*alistにaをpush */};
}

class A
{
void Hoge(B &b){ b.SetA( shared_ptr<A>(this) );};
}

大雑把ですが
このようなコードを実装するとHoge()から抜けるときに自分自身を削除することになってしまうわけですが
この設計を実現するためにはどうしたらいいでしょうか?