「std::unique ptr::release」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> __TOC__ == 概要 == std::unique_ptr の release() は、メモリの所有権を放棄します。 release()したメモリは...」)
 
行31: 行31:
 
void
 
void
 
release () {
 
release () {
        //for ( ; ; ) {
+
std::unique_ptr<C> p1(new C());
                std::unique_ptr<C> p1(new C());
+
  
                std::cout << "P1: ptr=" << p1.get() << std::endl;
+
std::cout << "P1: ptr=" << p1.get() << std::endl;
                C *p = p1.release(); // need delete
+
C *p = p1.release(); // need delete
                std::cout << "P1: ptr=" << p1.get() << std::endl;      // 0 になる。
+
std::cout << "P1: ptr=" << p1.get() << std::endl;      // 0 になる。
                delete p;
+
delete p;
        //}
+
 
}
 
}
  

2013年3月16日 (土) 14:48時点における版


概要

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++ -I/usr/local/include -L/usr/local/lib 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()


関連項目