この質問に対する一般的な回答は::std::shared_ptr
です。または、それがない場合、::std::tr1::shared_ptr
、またはそれがない場合は::boost::shared_ptr
です。あなたの特定のケースで
、私はいくつかの異なるアプローチの1をお勧めします:
一つの可能性は、当然のことながら、shared_ptrのアプローチです。基本的には、オブジェクトを必要とするすべての人にポインタを渡します。そして、それが必要なくなったときに自動的に破棄されます。あなたのテクスチャマネージャがそれを指し示すオブジェクトへのポインタで終わるつもりなら、あなたはリファレンスサイクルを作成しています。それは非常に慎重に扱わなければなりません。
もう一つの可能性は、それをローカル変数としてmain
に宣言して、それを必要とするすべての人へのポインタまたは参照として渡すことです。あなたのプログラムがそのように終わるまで、それは遠ざかることはありません。あなたは寿命を管理することについて心配する必要はありません。この場合、裸のポインタやリファレンスはうまくいきます。
3つ目の可能性は、シングルトンのようなものを漠然として受け入れられる用途の1つです。そして、これは詳細な説明が必要です。
あなただけの仕事をしている人は、物事に役に立つポインタを渡すことです。それが持っている主な機能は、ポインタを何に渡すべきかを伝える能力です。これは、グローバルに設定可能な工場のようなものです。
これにより、一般的なシングルトンで作成した巨大なテストの問題から脱出することができます。テストするときにスタブオブジェクトへのポインタを渡すように伝えてください。
また、同じ理由でシングルトンが表すアクセス制御/セキュリティの問題から逃れることができます(セキュリティ上の問題も発生します)。実行しようとしているコードセクションにアクセスする必要のないものへのアクセスを許可しないオブジェクトへのポインタを渡すように一時的に指示することができます。この考え方は、一般に、最小権限の原則と呼ばれています。
これを使用する主な理由は、ポインタを必要としている人を見つけ出し、それをそれらに渡すという問題を軽減できるからです。これは、それを使わない主な理由でもあります。また、あなたが予想しなかったコントロールフローのために、同じポインタをテクスチャマネージャに渡すことを期待していた2つのものが実際に異なるテクスチャマネージャへのポインタを得る可能性を紹介します。これは基本的に、最初にシングルトンを使うこと。最後に、シングルトンはとてもひどいので、これをもっとうまく使ってもかゆくなります。
個人的に、あなたのケースでは、私はちょうどmain
でスタック上に作成し、それが必要なのどこにポインタを渡し、アプローチ#2をお勧めします。それはあなたのプログラムの構造についてもっと慎重に考えるようになります。そして、この種のオブジェクトはおそらくあなたのプログラム全体の生涯にわたって生きるはずです。
texture_managerのグローバルインスタンスを宣言するだけではどうですか?グローバルが正しく処理されていれば、グローバルは邪悪ではありません。そして、それらは、他のインスタンスが複数のクライアントに渡って渡されるよりも、スレッド環境であまり危険ではない... – Mordachai