Episteme unique_ptr
Post on 16-Jan-2015
273 Views
Preview:
DESCRIPTION
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