私は C++11 の初心者であり、ポインターの直接使用を避けることで C++ スキルの向上に取り組んでいます。以前にロードされたスプライトを追跡し、未使用のスプライトを解放するスプライト マネージャーを作成しようとしています。これには shared_ptr (ビットマップへのポインター) を使用しようとしていますが、マネージャーはスプライトを作成するために shared_ptr も保持する必要があるため、参照カウントは 0 に落ちません。何らかの方法で「親」の shared_ptr を宣言できますか?私のマネージャーでは所有していないので、参照としてカウントされません(それでもそのshared_ptrの所有コピーを作成します)?
3 に答える
weak_ptrを使用します。それはあなたの問題を解決します。それらは自動的に解放されるため、解放する必要はありません。実際の shared_ptr を取得するには、weak_ptr のロックを使用します。
use_count は、現在の参照数も示します。
shared_ptr
所有するように作られています。プログラムの一部で非所有ポインターが必要な場合は、次のweak_ptr
ように使用します。
std::shared_ptr<Object> sp(new Object);
std::weak_ptr<Object>(sp);
あなたは一種の「後部座席ドライバー」スタイルのメモリ管理を行おうとしています。を使用したいが、 がいつリソースを解放するshared-ptr
かを制御したい!shared_ptr
ここでできることはいくつかあります。
shared_ptr
スプライト マネージャ クラスでは、メモリ管理やリソースの所有権を気にせずに使用してください。shared_ptr
その仕事を信頼してください。リソースがいつ破棄されるかを知る必要がある場合は、いつでもオブザーバー パターンなどを使用して、リソース クラスが破棄されたときにマネージャーにメッセージを送ることができます。もちろん、これは、スプライト マネージャーに既存のスプライトへの追加の参照を提供するように依頼できないことを意味しますが、これはそれほど素晴らしいことではありません。独自のスマート ポインターを記述します。必ずしも些細なことではありませんが、リソース固有の参照カウント スマート ポインターを作成することはロケット サイエンスではありません (
shared_ptr
たとえば、 のようなものを作成するよりもはるかに簡単です)。マネージャーは、リソースへの参照が 1 つしか残っていない場合 (たとえば、それ自体の参照)、リソースを終了できます。他の誰もがすでに言及してい
weak_ptr
ます。(1) のすべての利点がありshared_ptr
、同じ基になるリソースを参照する追加のインスタンスを作成できるのはあなただけです。
また、リソースの使用パターンとリソースの読み込みコストを考慮する必要がある場合もあります。アプリケーションがリソースの参照を停止したらすぐにリソースを破棄する必要があるとは限りません。1 秒後に再度要求された場合は、再読み込みに時間がかかる場合があります。しばらく使用されていないリソースを遅延して解放することは、より良いアプローチかもしれません。ちょっとした考え。