- ある開発者の覚書 - ソフトウェア開発者が情報処理に関する雑多な話題をジャンルを問わずに書き留めています.未来の私、私と同類のgeekたちへ

2008-08-21

weak pointer を bind

boost::bind は仕事で日常的に使用しているのですが,引数にboost::weak_ptrをbindするときには注意が必要です.ここ2日ほどはまってました.

void HogeFunc(boost::weak_ptr weakPtr){
}

boost::shared_ptr ptr(new CMyClass());
myFunc = boost::bind(&HogeFunc, ptr);

weak_ptrでバインドしてるから使わなくなったらptrは開放されるはず♪とおもって上記のようにやっちゃだめ!これでもコンパイルは普通に通ってしまうのが落とし穴なのですが,

boost::shared_ptr ptr(new CMyClass());
boost::weak_ptr wptr(ptr);
myFunc = boost::bind(&HogeFunc, wptr);

と明示的にweak_ptrでbindしなければptrはbindされてる限り残ります.なぜ?shared_ptrとしてbindされていてファンクタが呼ばれるときにweak_ptrを生成していると思われます.(しらべろよ!

0 件のコメント:

ブログ アーカイブ