Episteme unique_ptr

Post on 16-Jan-2015

273 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

Transcript

C++11: unique_ptr

わんくま同盟茶藝部顧問 episthmh  episteme@cppll.jp

Microsoft MVP for Visual C++ (2004~ )

本日、 CodeZineに載りました♪

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

一足お先に Visual Studio 2013 に

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

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

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

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&&); // 右辺値参照!  

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; } }}

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!}

こんなテもあるよ♪{ 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!}

top related