「スマートポインタ」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> スマートポインタは、メモリの管理を簡単にするためのライブラリです。 読み方 ;[[スマートポ...」)
 
 
行65: 行65:
  
 
シンプルな[[スマートポインタ]]として、 [[std::auto_ptr]] が挙げられます。
 
シンプルな[[スマートポインタ]]として、 [[std::auto_ptr]] が挙げられます。
 +
[[std::auto_ptr]] は、[[C++11]]の規格で非推奨となり、代替品として[[std::unique_ptr]]クラステンプレートが用意されました。
  
 
メモリ管理は、自分の手ではなく、[[スマートポインタ]]にお任せするべきです。
 
メモリ管理は、自分の手ではなく、[[スマートポインタ]]にお任せするべきです。

2013年3月16日 (土) 10:19時点における最新版


スマートポインタは、メモリの管理を簡単にするためのライブラリです。

読み方

スマートポインタ
すまーと ぽいんた

概要

C言語では、malloc()/free()で動的なメモリを管理しますが、C++ では、動的なメモリの確保に new を利用します。 new で確保したメモリは、不要になったときに delete で開放します。不要になったメモリを開放せずに、new し続けていくと、OSのメモリを食いつぶし、最後は、メモリ不足に陥ってしまうでしょう。

メモリを動的に確保した場合、問題になりやすいのが、メモリの解放忘れです。

たとえば、以下の様なケースです。

  • 関数が終わるときに、メモリを解放しなければならない。
  • クラスのインスタンスが消えるときに、インスタンスが抱えるメモリを解放しなければならない。
    • たとえば、 destructor で delete する。

デストラクタでメモリを解放する例

class AutoFree {
	Foo *p;
	AutoFree(Foo *ptr) : p(ptr) {}
	~AutoFree() { delete p; }
};

関数は、いろんなときに終わってしまいます。

  • return 文に遭遇したとき
  • 例外を throw したとき

関数を変更していくと、途中に return 文が増えたりします。 そういった場合に、解放しなければならないメモリを解放し忘れが発生しやすいです。

void f (int foo, int bar) {
	C *p = new C();
 
	if ( foo ) { // あとから追加した
		return; // あれ?
	}
 
	if (bar) { // あとから追加した
		throw std::exceptoin(); // え?
	}
 
	delete p;
}

メモリを管理するのは、プログラマの負担です。 メモリの寿命の管理を自動化する目的に作られたのが、スマートポインタです。

スマートポインタには、いくつかのタイプがあります。タイプによって、メモリを解放するタイミングが異なります。

  • 変数がスコープから外れたときにメモリが開放する。
  • 参照カウントを持ち、参照カウントがゼロになったときにメモリを解放する。
  • プログラマが参照カウントを管理する

シンプルなスマートポインタとして、 std::auto_ptr が挙げられます。 std::auto_ptr は、C++11の規格で非推奨となり、代替品としてstd::unique_ptrクラステンプレートが用意されました。

メモリ管理は、自分の手ではなく、スマートポインタにお任せするべきです。

インストール

  • C++ に標準的な std 系のライブラリは、g++ 等をインストールします。
  • Boostboost::thread を使う場合には、Boost をインストールします。

関連項目