「スマートポインタ」の版間の差分
提供: 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++ 等をインストールします。
- Boost の boost::thread を使う場合には、Boost をインストールします。