episteme unique_ptr

10
C++11: unique_ptr わわわわわわわわわわわ episthmh [email protected] Microsoft MVP for Visual C++ (2004 )

Upload: -

Post on 16-Jan-2015

273 views

Category:

Technology


0 download

DESCRIPTION

- 2013.11.02 C++例外安全Day@大阪 - 2013.11.09 わんくま同盟東京勉強会#85 - 2013.11.14 歌舞伎座.tech #2

TRANSCRIPT

Page 1: Episteme unique_ptr

C++11: unique_ptr

わんくま同盟茶藝部顧問 episthmh  [email protected]

Microsoft MVP for Visual C++ (2004~ )

Page 2: Episteme unique_ptr

本日、 CodeZineに載りました♪

Page 3: Episteme unique_ptr

unique_ptr auto_ptr は deprecated make_unique (C++14) が  

一足お先に Visual Studio 2013 に

Page 4: Episteme unique_ptr

unique_ptr{ unique_ptr<foo> pfoo(new foo(“adam”,10)); foo* p = pfoo.get(); pfoo->mem_fun(); (*pfoo).mem_fun(); … // デストラクタが”内包するポインタ”を deleteする}

Page 5: Episteme unique_ptr

unique_ptr : 配列にも対応{ unique_ptr<foo[]> afoo(new foo[4]); for ( int i = 0; i < 4; ++i ) { afoo[i].mem_fun(); } // デストラクタが”内包するポインタ”を delete[]する}

Page 6: Episteme unique_ptr

make_unique : C++14{ auto pfoo = make_unique<foo>(“adam”,10); auto afoo = make_unique<foo[]>(4); …}

Page 7: Episteme unique_ptr

unique_ptr は = で代入できない

unique_ptr<foo> p; unique_ptr<foo> q; p = q; // error!(見た目はcopy/挙動はmove) p = std::move(q); // OK

※ unique_ptr& operator=(const unique_ptr&) = delete;   そのかわり unique_ptr& operator=(unique_ptr&&); // 右辺値参照!  

Page 8: Episteme unique_ptr

deleter を外付けできる !namespace std { template<class T, class D=default_delete<T>> class unique_ptr;

template<class T> struct default_delete { // ポインタを手放す際にコレ↓を発動する void operator()(T* p) const { delete p; } }}

Page 9: Episteme unique_ptr

FILE* のための特殊化template<>struct std::default_delete<FILE> { void operator()(FILE* p) const { fclose(p); }};

{ auto fp = unique_ptr<FILE>(fopen(“foo.txt”,”w”)); fprintf(fp.get(), “Hello, world\n”); // 自動的に fclose!}

Page 10: Episteme unique_ptr

こんなテもあるよ♪{ typedef unique_ptr<FILE,function<void(FILE*)>> unique_file;

auto fp = unique_file( fopen(“foo.txt”,”w”), [](FILE* fp){fclose(fp);}); // 後始末のしかたをlambdaで与える fprintf(fp.get(), “Hello, world\n”); // 自動的に fclose!}