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

Unique ptr の紹介

4,018
-1

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
4,018
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Unique ptr の紹介

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

    Clipping is a handy way to collect important slides you want to go back to later.

×