boost::shared_ptrでHMODULEなどを管理する - ベイダー日記
これが動くのは、そもそも、HMODULEが、ポインター型であることを前提としている。HMODULEがポインターであることを隠すために、わざわざHMODULEという名前を使っているというのに。このコードは、ポータビリティに問題があると言える。
unique_ptrならば、こんなことができる。
struct HMODULE_deleter { typedef HMODULE pointer ; void operator () ( HMODULE handle ) { FreeLibrary( handle ) ; } } ; int main() { std::unique_ptr< HMODULE, HMODULE_deleter > handle( LoadLibrary( _T("kernel32.lib") ) ) ; }
なぜならば、unique_ptr<T, D>は、remove_reference<D>::type::pointerが存在する場合、unique_ptr::pointerは、その型になるからだ。
しかし、残念ながら、これは現行のshared_ptrには使えない。shared_ptrは、unique_ptrを引数に取るコンストラクタを提供している。しかし、unique_ptrのこの機能を提供していないということは、デフォルトのデリーターを使っていないunique_ptrからは、初期化できなくなってしまう。
なぜ、shared_ptrも、デリーターをテンプレート引数に取らないのだろう。いまなら、意見を言えば間に合うだろうか。
追記:よく考えたら、remove_referenceに通しているわけだから、typeはいらなかった。
ありがとうございます。unique_ptrの使い方は知りませんでした。勉強になります。
ReplyDeleteshared_ptrでも使えると便利そうですね。