スマートポインタ
提供: C++入門
スポンサーリンク
スマートポインタは、メモリの管理を簡単にするためのライブラリです。
読み方
- スマートポインタ
- すまーと ぽいんた
概要
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++ 等をインストールします。
- Boost の boost::thread を使う場合には、Boost をインストールします。
関連項目
ツイート
スポンサーリンク