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

提供: C++入門
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> スマートポインタは、メモリの管理を簡単にするためのライブラリです。 読み方 ;[[スマートポ...」)
(相違点なし)

2013年3月11日 (月) 00:05時点における版


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

読み方

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

概要

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 が挙げられます。

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

インストール

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

関連項目