スマートポインタ | Programming Place Plus 用語集

トップページ用語集

名称

解説

ポインタの動作を模倣した抽象データ型で、メモリ領域の自動的な解放や、境界検査などの機能を持つものです。

「スマート (smart)」は「賢い」という意味であり、「賢いポインタ」ということになります。通常のポインタと同様、メインメモリ上のどこかを指し示すものですが、いくつか追加の機能を持ち、主にポインタに絡むバグ(特に、ダイナミックメモリアロケーションに関係するもの)を防止できるようになっています。

たとえば、ダイナミックメモリアロケーションによって確保されたメモリ領域をスマートポインタによって管理すると、そのメモリ領域が不要になったタイミングを検知して、自動的に解放の処理を行うことができ、メモリリークを防げます。また、解放をスマートポインタに一任し、プログラマーが解放処理を記述しないことによって、二重解放のミスや、ダングリングポインタの発生を防ぐ効果もあります。

一般に、確保されたメモリ領域の所有権という考え方を用いており、所有権を持っている最後のスマートポインタが解放の処理を実行します。複数のスマートポインタによって共有する必要があるのなら、参照カウントの仕組みを用いて、所有権をもっているスマートポインタの個数を管理します。

C++ の場合

C++ の標準ライブラリには、unique_ptr、shared_ptr(および weak_ptr)といったスマートポインタが定義されています。これらはクラステンプレートとして実装され、通常のポインタの動作を、演算子オーバーロードによって実現しています。

また、解放の処理がデストラクタによって自動化されています。コンストラクタとデストラクタを用いて、確実な解放を実現する手法を RAII (Resource Acquisition Is Initialization) と呼びます。

unique_ptr は、所有権を持つスマートポインタを1つに限定するもので、unique_ptr 自身のコピーが禁じられています(ムーブは可能で、所有権が移動する)。unique_ptr 自身が破棄されるときに、メモリ領域が解放されます。

shared_ptr は、複数の箇所で共有されるメモリ領域を管理するもので、複数の shared_ptr が所有権を持つことができます。現在どれだけの個数の shared_ptr によって所有されているかを把握するために参照カウントの仕組みが用いられています。参照カウントの値は、shared_ptr のオブジェクトが増えるたびに増加し、破棄されるたびに減少します。参照カウントが 0 になったときに、メモリ領域が解放されます。なお、所有はしないが参照はしたいという場面や、循環参照を解決する方法として、weak_ptr を混在させることができます(weak_ptr は参照カウントに影響しない)。


参考リンク

更新履歴


用語集のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る