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