開発環境 | Visual C++ 2008 |
boostにはFunctionというライブラリがあります。 一言でいうと強化型関数ポインタですが、結構多機能です。 特にメンバ関数周りの機能が充実していて、以下のようにメンバ関数を格納した上に呼び出すこともできます。
boost::function<void ()> Func;
TestClass Object;
Func = boost::bind(&TestClass::Test, Object);
Func();
最後の行では、Object
を使わないでメンバ関数を呼び出しています。
こんなことをして大丈夫なのか気になりましたので調べてみました。
class TestClass { public: TestClass(void) {printf("Constructed this=%p\n", this);} TestClass(const TestClass& Test) {printf("Copy this=%p from=%p\n", this, &Test);} ~TestClass(void) {printf("Destructed this=%p\n", this);} void Test(void) {printf("Func this=%p\n", this);} }; void Test1(void) { boost::function<void ()> Func; { TestClass Object; Func = boost::bind(&TestClass::Test, Object); } Func(); }
Object
のスコープ外でFunc()
を実行してみました。
実行結果は以下の通り。
Constructed this=0012FE5B Copy this=0012FD54 from=0012FE5B Copy this=0012FC28 from=0012FD54 Copy this=0012FB20 from=0012FC28 Copy this=0012FC4F from=0012FB20 Destructed this=0012FB20 Destructed this=0012FC28 Copy this=0012FD5C from=0012FC4F Destructed this=0012FC4F Destructed this=0012FD54 Copy this=0012FC10 from=0012FD5C Copy this=0012FB00 from=0012FC10 Copy this=0012F9F8 from=0012FB00 Copy this=0012F8E0 from=0012F9F8 Copy this=0012F7D8 from=0012F8E0 Copy this=0012F6C0 from=0012F7D8 Destructed this=0012F6C0 Destructed this=0012F7D8 Destructed this=0012F8E0 Copy this=0012F8DC from=0012F9F8 Copy this=0012F7B0 from=0012F8DC Copy this=0012F67C from=0012F7B0 Copy this=0012FC48 from=0012F67C Destructed this=0012F67C Destructed this=0012F7B0 Destructed this=0012F8DC Destructed this=0012F9F8 Destructed this=0012FB00 Destructed this=0012FC10 Copy this=0012FBE0 from=0012FC48 Destructed this=0012FC48 Copy this=0012FE70 from=0012FBE0 Destructed this=0012FBE0 Destructed this=0012FD5C Destructed this=0012FE5B Func this=0012FE70 Destructed this=0012FE70
たくさんコピーが行われているようです。ちょっとびっくり。
Func()
実行時の出力はFunc this=0012FE70
です。
デストラクタは一番最後に呼び出されているようですので、Func()
実行時はオブジェクトは存在するようです。
おそらく、Func
オブジェクトがObject
のコピーを保持しているのでしょう。
次回に続きます。
投稿者 MASATO : 2008年03月09日 21:11 | トラックバック