• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
3,685
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
12
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. unique_ptr の紹介
    krustf ( @krustf )
  • 2. 自己紹介
    XAudio2 普及委員会メンバ(会員2名)
    第1回では XAudio2 について発表
    大学ではゲーム製作サークルで活動中
    現在 C++0x のお勉強中
    Lua 始めました
    2010/8/29
    unique_ptr の紹介
    1
  • 3. こんな人が創った C++ 言語
    2010/8/29
    unique_ptr の紹介
    2
  • 4. C++0x って?
    今年 FCD が承認された C++ の新標準規格
    現行の規格とほぼ100%の互換性を持つ
    GCC ( GNU Compiler Collection )Microsoft Visual C++などがすでに対応を始めている
    2010/8/29
    unique_ptr の紹介
    3
  • 5. 諸注意
    これから話す内容は現段階で全コンパイラがサポートできていない場合があります
    C++ のバージョン比較の定義
    現行のバージョン : C++03
    新規格 : C++0x
    2010/8/29
    unique_ptr の紹介
    4
  • 6. 生ポインタを直接とか(笑)
    2010/8/29
    unique_ptr の紹介
    5
    えーマジ
    生ポインタ?
    生ポインタが許されるのは小学生までだよねー
  • 7. バグの温床になりやすい
    new したものを手動で delete とか
    new したインスタンスを直接返すとか
    生ポインタを扱う事によるうっかりミスのバグがどれだけあるか
    2010/8/29
    unique_ptr の紹介
    6
  • 8. 2010/8/29
    unique_ptr の紹介
    7
    スマートポインタを使おう!
  • 9. スマートポインタとは
    賢い(Smart な)ポインタ
    動的確保されたメモリを自動的に deleteしてくれる(リソースを自動解放してくれる)ようなクラス
    宣言は違うが使い方はポインタそのもの
    2010/8/29
    unique_ptr の紹介
    8
  • 10. std::unique_ptr
    C++0x で追加されたスマートポインタ
    copy は不可能
    rvalue reference と move semantics を使ったポインタの「所有権の移動」が可能
    2010/8/29
    unique_ptr の紹介
    9
  • 11. 2010/8/29
    unique_ptr の紹介
    10
    (゚Д゚)ハァ?
  • 12. rvalue reference?move semantics?
  • 13. rvalue reference
    式の右側にあるものを rvalue と呼ぶ
    関数の戻り値などの「一時的で無名なデータ」である rvalue への「参照」
    「一時的」なら壊しても構わないはず
    2010/8/29
    unique_ptr の紹介
    12
  • 14. move semantics
    一時オブジェクトをコピーせずにポインタを移動しようという考え方
    rvalue として受け取ったものをコピーするのではなく移動(move)させる
    C++03 では auto_ptr が有名
    2010/8/29
    unique_ptr の紹介
    13
  • 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 [] がしっかり呼ばれる
  • 17. 2010/8/29
    unique_ptr の紹介
    16
    (・3・)アルェー?
  • 18. なんで?
    new - > delete
    new [] - > delete []
    どうやって区別してるの.....
    2010/8/29
    unique_ptr の紹介
    17
  • 19. デリータ指定が可能
    unique_ptr にはデリータクラス(オブジェクトを削除担当者)がテンプレート第2引数に指定可能
    default_delete<T> がデフォルトで指定
    2010/8/29
    unique_ptr の紹介
    18
  • 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;
  • 21. デリータの指定方法
    関数オブジェクト
    default_delete の特殊化
    関数を渡す(ちょっと面倒)
    2010/8/29
    unique_ptr の紹介
    20
    詳細な解説ははてなで記事書いてたのでこっち
    http://d.hatena.ne.jp/krustf/20100827/1282915158
  • 22. 2010/8/29
    unique_ptr の紹介
    21
    アプローチ方法がアレなので
  • 23. 質問形式で幾つか
  • 24. Q.元からポインタだったら?
  • 25. 特殊ケース(例. HANDLE 型)
    typedef void* HANDLE;といった通常使う型が元々ポインタだったら?
    2010/8/29
    unique_ptr の紹介
    24
    std::unique_ptr< HANDLE, handle_deleter >
    ptr( CreateEvent( NULL, FALSE, FALSE, NULL ) );
    #=> Error! 'コンストラクタのインスタンスと引数が一致しません'
  • 26. A.型からポインタを消せば良いじゃない
  • 27. 型からポインタを消す
    std::remove_pointer を使う
    2010/8/29
    unique_ptr の紹介
    26
    std::unique_ptr< std::remove_pointer<HANDLE>::type
    , ... > ptr( ... );

    std::unique_ptr< void, ... > ptr( ... );
  • 28. Q. 関数の戻り値にできる?
  • 29. unique_ptr で返却したい
    生ポインタで返すのは嫌
    2010/8/29
    unique_ptr の紹介
    28
    hoge* create_instance();
    hoge* ptr = create_instance();
    delete ptr; // 手動解放とか....
    // 解放しわすれでリークとか....
  • 30. A. 可能です
  • 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; なんて書かなくて済む
  • 32. Q.unique_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();
  • 34. A.auto を使おう!
  • 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 );
  • 37. 結論
  • 38. unique_ptr おいしいです
    boost.scoped_ptr
    デリータ指定できないし, move できない
    shared_ptr
    デリータ指定できるけどコスト的にどうなの?
    unique_ptr の使い道を考えると候補から外す
    std::auto_ptr
    C++0x から deprecated(廃止予定)になった
    2010/8/29
    unique_ptr の紹介
    37
  • 39. 積極的に使おう
    unique_ptr でメモリの手動解放をなくそう
    2010/8/29
    unique_ptr の紹介
    38
  • 40. auto_ptr にはご退場願います
  • 41. 今までありがとうございました
    2010/8/29
    unique_ptr の紹介
    40
    auto_ptr
    auto_ptr
  • 42. auto_ptr さようなら!
    ご清聴ありがとうございました
  • 43. 2010/8/29
    unique_ptr の紹介
    42
    宣伝
  • 44. 祝:プログラミングの魔道書発売!
    2010/8/29
    unique_ptr の紹介
    43
    © 株式会社ロングゲート
  • 45. 2010/8/29
    unique_ptr の紹介
    44
    © 株式会社ロングゲート
  • 46. 2010/8/29
    unique_ptr の紹介
    45
    © 株式会社ロングゲート