狠狠撸

狠狠撸Share a Scribd company logo
わんくま同盟茶藝部顧問

episthmh

episteme@cppll.jp

Microsoft MVP for Visual C++ (2004~)
本日、CodeZine
に載りました?
auto_ptr は deprecated
? make_unique (C++14) が
一足お先に Visual Studio 2013 に
?
{

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

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

auto pfoo = make_unique<foo>(“adam”,10);
auto afoo = make_unique<foo[]>(4);
…
}
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&&); // 右辺値参照!
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; }
}
}
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, worldn”);
// 自動的に 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, worldn”);
// 自動的に fclose!
}

More Related Content

Episteme unique_ptr