Contenu connexe Similaire à Unique ptr の紹介 (15) Plus de Daisuke Nikura (10) Unique ptr の紹介4. C++0x って? 今年 FCD が承認された C++ の新標準規格 現行の規格とほぼ100%の互換性を持つ GCC ( GNU Compiler Collection )Microsoft Visual C++などがすでに対応を始めている 2010/8/29 unique_ptr の紹介 3 15. 早速使ってみる 2010/8/29 unique_ptr の紹介 14 #include <memory> std::unique_ptr< int > ptr( new int(5) ); if( ptr ) { std::cout << *ptr << std::endl; } // スコープの末尾で自動的に delete を呼ぶ 16. 配列も使える 2010/8/29 unique_ptr の紹介 15 #include <memory> std::unique_ptr< int[] > ptr( new int[5] ); for( int i = 0 ; i < 5 ; ++i ) { ptr[ i ] = i; } // delete [] がしっかり呼ばれる 18. なんで? new - > delete new [] - > delete [] どうやって区別してるの..... 2010/8/29 unique_ptr の紹介 17 20. std::default_delete 2010/8/29 unique_ptr の紹介 19 namespace 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; 25. 特殊ケース(例. HANDLE 型) typedef void* HANDLE;といった通常使う型が元々ポインタだったら? 2010/8/29 unique_ptr の紹介 24 std::unique_ptr< HANDLE, handle_deleter > ptr( CreateEvent( NULL, FALSE, FALSE, NULL ) ); #=> Error! 'コンストラクタのインスタンスと引数が一致しません' 27. 型からポインタを消す std::remove_pointer を使う 2010/8/29 unique_ptr の紹介 26 std::unique_ptr< std::remove_pointer<HANDLE>::type , ... > ptr( ... ); ↓ std::unique_ptr< void, ... > ptr( ... ); 29. unique_ptr で返却したい 生ポインタで返すのは嫌 2010/8/29 unique_ptr の紹介 28 hoge* create_instance(); hoge* ptr = create_instance(); delete ptr; // 手動解放とか.... // 解放しわすれでリークとか.... 31. 関数の戻り値には move が働く 2010/8/29 unique_ptr の紹介 30 std::unique_ptr<hoge> create_instance(); std::unique_ptr<hoge> ptr = create_instance(); // 自動的に move が働いてポインタが移動される ptr->func(); // 自動的に削除, delete ptr; なんて書かなくて済む 33. ややこしい..... 2010/8/29 unique_ptr の紹介 32 std::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(); 35. auto C++03 では局所変数についての明確な宣言 コンパイラが知っているので関数の戻り値や初期化値で推論してもらう 2010/8/29 unique_ptr の紹介 34 std::vector<int> arr; // it は std::vector<int>::iterator と推論 auto it = arr.begin(); 36. 戻り値がややこしい時は auto 2010/8/29 unique_ptr の紹介 35 std::unique_ptr< std::remove_pointer<LPDIRECT3DDEVICE9>::type , com_deleter<LPDIRECT3DDEVICE9> > create_device(); auto device = create_device(); device->Present( NULL, NULL, NULL, NULL ); 38. unique_ptr おいしいです boost.scoped_ptr デリータ指定できないし, move できない shared_ptr デリータ指定できるけどコスト的にどうなの? unique_ptr の使い道を考えると候補から外す std::auto_ptr C++0x から deprecated(廃止予定)になった 2010/8/29 unique_ptr の紹介 37