unique_ptr の紹介krustf ( @krustf )
自己紹介XAudio2 普及委員会メンバ(会員2名)第1回では XAudio2 について発表大学ではゲーム製作サークルで活動中現在 C++0x のお勉強中Lua 始めました2010/8/29unique_ptr の紹介1
こんな人が創った C++ 言語2010/8/29unique_ptr の紹介2
C++0x って?今年 FCD が承認された C++ の新標準規格現行の規格とほぼ100%の互換性を持つGCC ( GNU Compiler Collection )Microsoft Visual C++などがすでに対応を始めている2010/8/29unique_ptr の紹介3
諸注意これから話す内容は現段階で全コンパイラがサポートできていない場合がありますC++ のバージョン比較の定義現行のバージョン	: C++03新規格			: C++0x2010/8/29unique_ptr の紹介4
生ポインタを直接とか(笑)2010/8/29unique_ptr の紹介5えーマジ生ポインタ?生ポインタが許されるのは小学生までだよねー
バグの温床になりやすいnew したものを手動で delete とかnew したインスタンスを直接返すとか生ポインタを扱う事によるうっかりミスのバグがどれだけあるか2010/8/29unique_ptr の紹介6
2010/8/29unique_ptr の紹介7スマートポインタを使おう!
スマートポインタとは賢い(Smart な)ポインタ動的確保されたメモリを自動的に deleteしてくれる(リソースを自動解放してくれる)ようなクラス宣言は違うが使い方はポインタそのもの2010/8/29unique_ptr の紹介8
std::unique_ptrC++0x で追加されたスマートポインタcopy は不可能rvalue reference と move semantics を使ったポインタの「所有権の移動」が可能2010/8/29unique_ptr の紹介9
2010/8/29unique_ptr の紹介10(゚Д゚)ハァ?
rvalue reference?move semantics?
rvalue reference式の右側にあるものを rvalue と呼ぶ関数の戻り値などの「一時的で無名なデータ」である rvalue への「参照」「一時的」なら壊しても構わないはず2010/8/29unique_ptr の紹介12
move semantics一時オブジェクトをコピーせずにポインタを移動しようという考え方rvalue として受け取ったものをコピーするのではなく移動(move)させるC++03 では auto_ptr が有名2010/8/29unique_ptr の紹介13
早速使ってみる2010/8/29unique_ptr の紹介14#include <memory>std::unique_ptr< int >     ptr( new int(5) );if(  ptr  ) {	std::cout << *ptr << std::endl;}// スコープの末尾で自動的に delete を呼ぶ
配列も使える2010/8/29unique_ptr の紹介15#include <memory>std::unique_ptr< int[] >     ptr( new int[5] );for( int i = 0 ; i < 5 ; ++i ) {	ptr[ i ] = i;}// delete [] がしっかり呼ばれる
2010/8/29unique_ptr の紹介16(・3・)アルェー?
なんで?new	- >	   deletenew []	- >	   delete []どうやって区別してるの.....2010/8/29unique_ptr の紹介17
デリータ指定が可能unique_ptr にはデリータクラス(オブジェクトを削除担当者)がテンプレート第2引数に指定可能default_delete<T> がデフォルトで指定2010/8/29unique_ptr の紹介18
std::default_delete2010/8/29unique_ptr の紹介19namespace std {	template< class T >	// 通常struct  default_delete {		void operator()( T* ptr ) const { delete ptr; };	};	template< class T >	// 配列struct  default_delete< T[] > {		void operator()( T* ptr ) const { delete [] ptr; };	};} // namespace std;
デリータの指定方法関数オブジェクトdefault_delete の特殊化関数を渡す(ちょっと面倒)2010/8/29unique_ptr の紹介20詳細な解説ははてなで記事書いてたのでこっちhttp://d.hatena.ne.jp/krustf/20100827/1282915158
2010/8/29unique_ptr の紹介21アプローチ方法がアレなので
質問形式で幾つか
Q.元からポインタだったら?
特殊ケース(例. HANDLE 型)typedef  void*  HANDLE;といった通常使う型が元々ポインタだったら?2010/8/29unique_ptr の紹介24std::unique_ptr< HANDLE, handle_deleter >	ptr(  CreateEvent( NULL, FALSE, FALSE, NULL )  );#=> Error! 'コンストラクタのインスタンスと引数が一致しません'
A.型からポインタを消せば良いじゃない
型からポインタを消すstd::remove_pointer を使う2010/8/29unique_ptr の紹介26std::unique_ptr< std::remove_pointer<HANDLE>::type		   , ... >   ptr( ... );↓std::unique_ptr< void, ... >	  ptr( ... );
Q. 関数の戻り値にできる?
unique_ptr で返却したい生ポインタで返すのは嫌2010/8/29unique_ptr の紹介28hoge*  create_instance();hoge*  ptr = create_instance();delete  ptr;	// 手動解放とか....		// 解放しわすれでリークとか....
A. 可能です
関数の戻り値には move が働く2010/8/29unique_ptr の紹介30std::unique_ptr<hoge>  create_instance();std::unique_ptr<hoge>  ptr = create_instance();	// 自動的に move が働いてポインタが移動されるptr->func();// 自動的に削除,  delete ptr; なんて書かなくて済む
Q.unique_ptr の型が面倒だったら?
ややこしい.....2010/8/29unique_ptr の紹介32std::unique_ptr<	std::remove_pointer<LPDIRECT3DDEVICE9>::type	, com_deleter<LPDIRECT3DDEVICE9>>    create_device();std::unique_ptr<	std::remove_pointer<LPDIRECT3DDEVICE9>::type	, com_deleter<LPDIRECT3DDEVICE9>>   ptr  =  create_device();
A.auto を使おう!
autoC++03 では局所変数についての明確な宣言コンパイラが知っているので関数の戻り値や初期化値で推論してもらう2010/8/29unique_ptr の紹介34std::vector<int>  arr;// it は std::vector<int>::iterator と推論auto  it = arr.begin();
戻り値がややこしい時は auto2010/8/29unique_ptr の紹介35std::unique_ptr<	std::remove_pointer<LPDIRECT3DDEVICE9>::type	, com_deleter<LPDIRECT3DDEVICE9>>    create_device();auto  device  = create_device();device->Present( NULL, NULL, NULL, NULL );
結論
unique_ptr おいしいですboost.scoped_ptrデリータ指定できないし, move できないshared_ptrデリータ指定できるけどコスト的にどうなの?unique_ptr の使い道を考えると候補から外すstd::auto_ptrC++0x から deprecated(廃止予定)になった2010/8/29unique_ptr の紹介37
積極的に使おうunique_ptr でメモリの手動解放をなくそう2010/8/29unique_ptr の紹介38
auto_ptr にはご退場願います
今までありがとうございました2010/8/29unique_ptr の紹介40auto_ptrauto_ptr
auto_ptr さようなら!ご清聴ありがとうございました
2010/8/29unique_ptr の紹介42宣伝
祝:プログラミングの魔道書発売!2010/8/29unique_ptr の紹介43© 株式会社ロングゲート
2010/8/29unique_ptr の紹介44© 株式会社ロングゲート
2010/8/29unique_ptr の紹介45© 株式会社ロングゲート

Unique ptr の紹介