2016年12月11日オープンソースのライブラリのソースコードを呼んでいるとC++11で追加されたunique_ptrを使用しているところもちらほらと見られるようになってきています。MFCなどを利用していれば動的確保したメモリ以外にもHINSTANCE型やHBITMAP型など後処理が必要なリソースを扱うことが多いはずです。C++などでも解説されているように「リソースの確保が初期化」(RAII)をしっかりと守るためにスマートポインタは早いうちから使い方に慣れていくことが大事になります。今回はLoadLibrary関数から取得したHINSTANCE(HMODULE)型をunique_ptrとして管理してみましょう。まとめunique_ptr?名前からも推測できるように、リソースの所有権を一意(unique)にもっているように振る舞うスマートポインタ(賢いポインタ)です。スマートポインタとは?任意のリソースを指し示すポインタです。スマートポインタが削除される際(スコープから抜けるなど)にそのスマートポインタが指すリソースも正しく削除されるため、リソースを管理する場合はこういったスマートポインタを利用するべきです。同様に振る舞うスマートポインタ、auto_ptrを置き換えるものとして追加されました。所有権を一意に持つ?auto_ptrはコピーをする際に、コピー元をNULLにし同じリソースを指すスマートポインタを複数持つような動作はできない仕組みになっていました。"コピーした際に所有権がp2に移っているため、p1はNULLを指す。"コピーした際に所有権がp2に移っているため、p1はNULLを指す。std::endl;}同じリソースを指すスマートポインタが複数あれば、複数回deleteが実行され未定義の動作が実行されてしまうため、この方法でそういった実装ができないようになっていました。unique_ptrも同様に同じリソースを指すスマートポインタを複数持つことはできないように実装されています。"コピーした際に所有権がp2に移っているため、p1はNULLを指す。"コピーした際に所有権がp2に移っているため、p1はNULLを指す。std::endl;}ただし、4行目のような初期化はできなくなっています。所有権を移動させるにはstd::move関数(5行目)を使用します。解放処理auto_ptrでは解放の処理は必ずdeleteが実行されるため、動的確保した配列には使用することはできませんでした。配列はdelete[]で解放しなければいけないのに、auto_ptrはdeleteを呼んでしまう。配列はdelete[]で解放しなければいけないのに、auto_ptrはdeleteを呼んでしまう。0;}unique_ptrは配列に対しても正しくdelete[]が呼ばれるようにテンプレートとして特殊化されているので安心して使用することができます。cpprefarence.comまた専用のデリータ関数(リソースを解放するための関数)を自分で定義することもできるようになっています。これはサンプルプログラムを見てもらった方がいいかもしれません。HINSTANCE型のリソースを解放する紹介するサンプルプログラムではDLLファイルを読み取り、そのまま解放するだけのプログラムです。DLLファイルの読み取りはLoadLibrary関数を呼び、後処理にはFreeLibrary関数を呼ばなければいけません。*型ではなく、HINSTANCE__構造体のポインタとして定義されています。HMODULEとして定義されているので、HINSTANCE型とHMODULE型は全く同じ型です。HINSTANCEについてはリンク先のページに詳しいです。通信用語の基礎知識また、解放にはdeleteやdelete[]ではなく、FreeLibrary関数を呼ぶ必要があるためデリータを定義する必要があります。pointer;」はとても不思議に見えます。デリータが指定された場合、unipue_ptrの実装ではpointer型(テンプレート引数のtypedef)の存在をチェックします。pointer型が存在している場合は、デリータの引数にpointer型を指定し、デリータを呼び出すようになっており、存在しない場合は第一引数の型を使用するようになっています。実際にプログラムを打ち込んで、2行目をコメントアウトすると代入できないといったエラーメッセージが表示されるはずです。Overflow実行コストは?さて、リソース管理に大変便利なunique_ptrですが、実行コストはどれくらいなのでしょうか。実は生のポインタを使用する場合とほぼ違いがありません。そのため、特に明確な理由がなければリソース管理でunique_ptrを使わない手はないのです。試しに、上記のサンプルプログラムをunique_ptrを使用した場合と、直接LoadLibrary/FreeLibraryを使用した場合でそれぞれ10,000回呼び出した際の実行時間を確認したところ、以下のような結果でした。20698.7ms最適化の影響なのか、unique_ptrを使った方が早いくらいでした。この結果から実行時コストを気にしてunique_ptrを使わないといった判断はできないことが分かります。まとめ少し記事が長くなってしまいましたが、C++11で実装されたunique_ptrの有用性を伝えることができたでしょうか?オープンソースなどでは新しい技術なども使われたりするのでとても勉強になります。(意味が分からずに困惑することもありますが...。)これからリソースの管理を行う場合にはunique_ptrをまず考えてみてください。多くの場合はunique_ptrを使うことが正解になると思いますヨ。その2昨日に続き、プログレスバーをマルチスレッドを用いて実装してみましょう。スレッド実行中はモーダルダイアログを表示させること。...【OpenCV】OpenCVをビルドして画像処理をしてみよう!今日はOpenCVを使って画像表示をしてみたいと思います。ツールやアプリケーションを作る場合、多かれ少なかれ画像処理は必要になってくるのではないでしょうか。...【Boost】boost::property_treeでXMLファイルを書き込もう!前回の記事でXMLファイルの書き込みは難しくなくできそうでしたネ。今回はXMLファイルの書き込みを行い、出力してみましょう。...C++でインターフェイスを作成しよう。私事ですが今後業務ではC++を使用することになりそうです。その1実は今回紹介する方法は、もしかしたら正しくないのかもしれません。ダイアログベースのプログラムで以下の条件を満たし、プログレスバーを表示したいと考えました。