参照カウント | Programming Place Plus 用語集

トップページ用語集

名称 🔗

解説 🔗

リソースメモリやハンドルなど)が、現時点でいくつの場所から参照されているかをつねにカウント、記憶しておき、その数が 0 に戻ったときに解放するというリソース管理の仕組みのことです。

たとえば、あるオブジェクトをメモリ領域に生成し、そのオブジェクトを指し示す変数ポインタリファレンスなど)が作られると、オブジェクトへの参照カウントは 1 になります。その後、そのオブジェクトがほかの変数やデータ構造などから参照されるようになるたびに、参照カウントは +1(インクリメント)されます。

オブジェクトを参照していた変数やデータ構造が破棄されたり、別のオブジェクトを参照するように変更(ヌルポインタやヌル参照になることを含む)されたりすると、参照カウントは -1(デクリメント)されます。この結果、参照カウントが 0 になったとすると、オブジェクトはもうどこからも参照されていないことを意味するため、このオブジェクトは破棄することができ、メモリ領域を解放します。

通常、リソースは使用を終えたときに解放処理を行わなければならず、これを怠るとメモリリークやリソースリークと呼ばれるバグとなります。参照カウントは解放を自動化する方法の1つとして、よく利用されています(このほか代表的な方法にガーベジコレクションがあります)。C++スマートポインタや、Swift の自動参照カウントなどは、参照カウントを利用したリソース管理の例です。

参照カウントの問題点として、循環参照に弱いことがあげられます。たとえば、オブジェクトA がオブジェクトB を参照し、オブジェクトB がオブジェクトA を参照している場合、ほかにはどこからも参照されていない状態になっても、互いの参照が残っているため、両者の参照カウントが 0 になることがなく、どちらも解放できません。このような循環参照を検出して解決するためには、弱参照などの仕組みが必要となります。

また、大きな問題になるケースは少ないものの、参照カウント自体を記憶するためのメモリが追加で必要になることや、参照カウントを増減する処理のオーバーヘッドが発生することにも注意が必要です。マルチスレッド環境においては、スレッド安全なカウンタ操作(アトミック操作など)がさらにコストになります。


参考リンク 🔗

更新履歴 🔗


用語集のトップページへ

Programming Place Plus のトップページへ



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