まず第一に、これはshared_ptrの目的と完全に矛盾していることに気づきました。私は、ParticleSystemのインスタンスが、各パーティクルに使用されるテクスチャを設定するために、構築中にshared_ptrが渡されることを期待するライブラリコードを扱っています。重要なのは、テクスチャが具体的な所有権を持つ方法でプログラムの残りの部分をすでに構築していることです(それが正しい用語である場合)-TextureCacheはすべてのテクスチャを所有しています。したがって、テクスチャを削除せずにこのParticleSystemクラスを操作する方法が必要です。そのような新しいインスタンスを単純に作成するParticleSystem(std::shared_ptr<Texture>&myTexture)
と、破壊時にテクスチャを破壊しようとします(これは、テクスチャがで作成されていないため、不要で無効な操作ですnew
)。
この問題の周りで私が見る最もきれいな方法は次のようなものです:
- ParticleSystemを作成する関数でテクスチャを保持するshared_ptrを作成します。
- 次に、placement newを使用して、先ほど作成したshared_ptrと同じメモリ位置にshared_ptrを再構築します。テクスチャの参照カウントは2になります。
- パーティクルシステムを作成します。
- shared_ptrをスコープ外にします。そのデコンストラクタは、スタックに割り当てられたために呼び出され、参照カウントを1だけデクリメントします。したがって、オブジェクトの参照カウントは常に実際よりも1大きくなるため、自動的に破棄されることはありません。
この解決策は健全だと思いますが、それでも信じられないほどハックな感じがします。私の問題を解決するためのより良い方法はありますか?