「std::unique ptr::reset」の版間の差分
提供: C++入門
(ページの作成:「<!-- vim: filetype=mediawiki --> __TOC__ == 概要 == std::unique_ptrのresetは、ポインタをリセットします。 * reset() は、メモリを解放し...」) |
細 (Daemon がページ「Std::unique ptr::reset」を「std::unique ptr::reset」に移動しました) |
||
(同じ利用者による、間の1版が非表示) | |||
行106: | 行106: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | g++ - | + | g++ unique_ptr_reset_2.cpp -o unique_ptr_reset_2 |
+ | |||
+ | g++48 -std=c++11 unique_ptr_reset_2.cpp -o unique_ptr_reset_2 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
2013年3月23日 (土) 16:24時点における最新版
目次
概要
std::unique_ptrのresetは、ポインタをリセットします。
- reset() は、メモリを解放します。
- reset(new Class)/reset(ptr) は、すでにポインタを持っていれば、メモリを解放し、引数で与えられたポインタを扱います。
std::unique_ptr::reset の例 1
ソースコード unique_ptr_reset.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 reset () { std::unique_ptr<C> p1(new C()); std::cout << p1.get() << std::endl; p1.reset(); // not need delete std::cout << p1.get() << std::endl; } int main(int argc, char const* argv[]) { reset(); return 0; }
コンパイル
g++ -I/usr/local/include -L/usr/local/lib unique_ptr_reset.cpp -o unique_ptr_reset
実行例
% ./unique_ptr_reset 0x28404100 C::~C() 0
std::unique_ptr::reset の例 1
reset() で新しいポインタをセットしなおす例です。
ソースコード unique_ptr_reset_2.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 reset () { std::unique_ptr<C> p1(new C()); C *c2 = new C(); std::cout << "P1: ptr=" << p1.get() << std::endl; std::cout << "c2: ptr=" << c2 << std::endl; p1.reset(c2); std::cout << p1.get() << std::endl; // c2 ptr } int main(int argc, char const* argv[]) { reset(); return 0; }
コンパイル
g++ unique_ptr_reset_2.cpp -o unique_ptr_reset_2 g++48 -std=c++11 unique_ptr_reset_2.cpp -o unique_ptr_reset_2
実行例
新しいポインタをセットしたときに、p1が最初に保持していたインスタンスが解放されていることが確認できます。
% ./unique_ptr_reset_2 P1: ptr=0x28404100 c2: ptr=0x28404102 C::~C() 0x28404102 C::~C()