「std::unique ptr::release」の版間の差分
提供: C++入門
(ページの作成:「<!-- vim: filetype=mediawiki --> __TOC__ == 概要 == std::unique_ptr の release() は、メモリの所有権を放棄します。 release()したメモリは...」) |
細 (Daemon がページ「Std::unique ptr::release」を「std::unique ptr::release」に移動しました) |
||
(同じ利用者による、間の3版が非表示) | |||
行31: | 行31: | ||
void | void | ||
release () { | release () { | ||
− | + | std::unique_ptr<C> p1(new C()); | |
− | + | ||
− | + | std::cout << "P1: ptr=" << p1.get() << std::endl; | |
− | + | C *p = p1.release(); // need delete | |
− | + | std::cout << "P1: ptr=" << p1.get() << std::endl; // 0 になる。 | |
− | + | delete p; | |
− | + | ||
} | } | ||
行52: | 行50: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | g++ - | + | g++ unique_ptr_release.cpp -o unique_ptr_release |
+ | g++48 -std=c++11 unique_ptr_release.cpp -o unique_ptr_release | ||
</syntaxhighlight> | </syntaxhighlight> | ||
2013年3月23日 (土) 16:25時点における最新版
概要
std::unique_ptr の release() は、メモリの所有権を放棄します。 release()したメモリは、明示的な delete を必要としています。
std::unique_ptrのrelease() の例
ソースコード unique_ptr_release.cpp
#include <iostream> #include <exception> #include <memory> class C { public: C() { } ~C() { std::cout << __PRETTY_FUNCTION__ << std::endl; } void doit (){ std::cout << __PRETTY_FUNCTION__ << std::endl; } }; void release () { std::unique_ptr<C> p1(new C()); std::cout << "P1: ptr=" << p1.get() << std::endl; C *p = p1.release(); // need delete std::cout << "P1: ptr=" << p1.get() << std::endl; // 0 になる。 delete p; } int main(int argc, char const* argv[]) { release(); return 0; }
コンパイル
g++ unique_ptr_release.cpp -o unique_ptr_release g++48 -std=c++11 unique_ptr_release.cpp -o unique_ptr_release
実行例
release() を呼び出すと std::unique_ptr が所有していたメモリが返させ、スマートポインタとしてメモリ管理をしなくなります。よって、2回めのget()では、アドレスを取得した場合、0が返されます。そのため、release()後は、プログラマがメモリを管理しなければなりません。
% ./unique_ptr_release P1: ptr=0x28404100 P1: ptr=0 C::~C()