どのような参照カウントスマートポインタのリファレンスカウンター。
-
05-09-2019 - |
質問
つまり、どのようなケースの実装は、カウント?
ある地図のようなオブジェクトを維持するアクセス可能なすべての shared_ptr
インスタンスのポインタのアドレスおよび値は参考文献の件数?合いを実施する shared_ptr
, このという考えが来るのを興味を持っていました。
があるので、メモリリークの場合これらの参照カウントスマートポインター?の答えを見出さなければならないたいので避けているのか。
解決
いに異なる二つの非接触的にこの
- スマートポインタを割り当て小さな ブロックメモリを含んでい 参考カウンタです。各コピーの スマートポインタを受け取る ポインタのオブジェクトと ポインタを参照す。
- ほか、オブジェクトへのポインタ 各スマートポインタが含まれて 前後のポインタを 成形には、二重リンクリスト スマートポインタを特定の オブジェクトです。参照カウントする 暗黙の一覧です。時に、スマート ポインタがコピーされ、そのものを の一覧です。に破壊し、各 スマートポインタを削除しますか の一覧です。の場合は最後に リストにその解放を 参照オブジェクトです。
れば こちらの スクロールの底が図を説明するこれらの方法により明確にする。
他のヒント
参照カウントスマートポインタとメモリリークを作成することは非常に簡単です。ただ、グラフのサイクルを持っているオブジェクトのいずれかのグラフのような構造を作成します。サイクル内のオブジェクトが解放されるからお互いを防ぐことができます。これは自動的に解決することはできません - あなたは、二重リンクリストを作成するときに、たとえば、あなたが一度に複数のオブジェクトを削除することはありませんの世話をする必要があります。
。各スマートポインタオブジェクトは共有参照カウント含まれています - 。すべての生のポインタのための1つを
あなたはでこのの記事を見てかかることがあります。この実装は、約コピーする別のオブジェクトでこれらを格納します。また、ブーストのドキュメントのを見てかかることがありますかスマートポインタのウィキペディアの記事のを見てみます。
はありません。 shared_ptrのちょうど参照カウントのための1つの追加のポインタを保持します。
あなたはshared_ptrのオブジェクトのコピーを作成する場合は、これは参照のカウントがポインタをコピーし、それを増加させ、そして含まれるオブジェクトにポインタをコピーします。
私が覚えている限りでは、効果的なC ++の章で扱わ参照カウントポインタの問題があった。
原則として、あなたは/デクリメント参照をインクリメントし、ポインタオブジェクトを破壊するために知っているの参照を保持するクラスへのポインタを含む、「光」ポインタクラスを持っています。参照されるオブジェクトへの参照カウントクラスポイントを
多くの答えは、参照カウントが(それは同じネイティブポインタを保持するすべてのshared_ptrのための共有メモリに保存されている)が格納されている方法を取り上げますが、ほとんどはリークの問題を免れるます。
参照カウントポインタをメモリリークの最も簡単な方法は、サイクルを作成しています。例として、すべてのポインタが少なくとも2つの要素とのshared_ptrされている二重リンクリストは削除されないことが保証されます。外部ポインタが解放された場合でも、内部ポインタはまだカウントされますと、参照カウントが最もナイーブな実装で、少なくとも、ある0に到達しません。
サイクル問題に対する最も簡単な解決策は、オブジェクトの所有権を共有していない弱いポインタとのshared_ptr(参照カウントポインタ)を混合されます。
の共有ポインタは、リソース(ポインタ)と追加REFERENCE_COUNT情報の両方を共有します。あなたは、弱いポインタを使用する場合、参照カウントが2倍になる:共有ポインタの参照カウントと弱いポインタの参照カウントがあります。共有ポインタのカウントが0に達するたびにリソースが解放されますが、最後の弱いポインタが解放されるまでREFERENCE_COUNT情報が生きて残されています。
内部リンクがちょうどweak_ptrをしている間、二重連結リストでは、外部参照は、shared_ptrのに保持されます。ある時はいつでも外部参照(shared_ptrの)リストの要素が弱参照を削除、解放されていません。終わりに、すべての弱参照が削除されている各リソースへの最後の弱いポインタがREFERENCE_COUNT情報を解放します。
私が後でもう一度試してみます...上記のテキストは思わほど混乱しています。