ガーベジコレクションや参照カウント方式のメモリ管理において、管理対象のオブジェクトを参照しているが、そのオブジェクトのライフサイクルには影響を与えないリファレンスのことです。
参照カウント方式のメモリ管理では、オブジェクトがあらたに参照されると +1(インクリメント)、参照されなくなると -1(デクリメント)されるカウンタを持ち、カウンタが 0 になったらオブジェクトを解放します。通常、この仕組みで正しく管理できますが、オブジェクト同士が互いを参照しあう循環参照があると、カウンタが 0 にならず、オブジェクトが解放されない問題が発生します。この問題を解決する手段として、弱参照によって参照される場合には、カウンタを増減させないようにします。
また、参照カウント方式を取らないトレーシングガーベジコレクションの場合、弱参照は、オブジェクトが到達可能であるかどうかの判定に影響を与えないものとして扱われます。つまり、弱参照だけで参照されているオブジェクトは、ガーベジコレクタによって解放される可能性があります。
なお、弱参照に対して、オブジェクトのライフサイクルに影響を与える通常の参照を強参照と呼ぶことがあります。
C++ の標準にはガーベジコレクションの機能はありませんが、標準ライブラリには、スマートポインタによるメモリ管理の仕組みが提供されています。そのうち、std::shared_ptr を使う方法は参照カウント方式に基づいており、循環参照の問題が発生する可能性があります。そこで、std::shared_ptr における弱参照の仕組みとして、std::weak_ptr が提供されています。
std::weak_ptr は、std::shared_ptr によって管理されているオブジェクトを参照できますが、参照カウンタを増減させないため、循環参照の問題を回避できます。
Programming Place Plus のトップページへ
| はてなブックマーク に保存 | Facebook でシェア | X で ポスト/フォロー |
| LINE で送る | noteで書く |
|
| 管理者情報 | プライバシーポリシー |