私はC++で比較的大きなプロジェクトを書いていますが、オブジェクトの削除に問題があります。プロジェクトは、正確には、ローグライクゲームです。
Npc
ゲーム内のすべてのモンスターであるクラスがあります。Storage<Npc>
それらは、それらの管理(ロード、保存、作成、削除など)を担当する別のクラスで作成および保存されます。モンスターが死ぬたびに、対応するオブジェクトnpc
を削除して完全に破壊する必要があります。オブジェクト自体を削除することは問題ではありません。私はからメソッドを呼び出すだけStorage<NPC>
です。問題は、コードにこのすでに死んnpc
でいるポインタへのポインタがたくさん含まれていることです。これらのポインタは現在無効であり、それらを使用しようとすると多くの問題が発生します。例えば:
- 彼が死ぬ前に彼が実行しようとした行動があるかもしれません。
- 彼がレコードに立っていたタイルには、彼へのポインターが保存されています。
- 彼は誰かと格闘するなど、いくつかの継続的な活動に関与していた可能性があります。
コードにはそのようなポインタがたくさんあるので、それらを単純に追跡することはほぼ不可能です。私が必要としているのは、annpc
がすでに死んでいて、そのアドレスに実際のオブジェクトが格納されていないことを確認する方法です。これにより、このポインターがまだあるコードの部分が、彼の死に適切に反応できるようになります。
私自身、いくつかのアイデアを思いついたのですが、これまでのところ、どれも私には本当に良いとは思えません。
Storage<NPC>
そのようなアドレスにオブジェクトがあるかどうかをクラスに尋ねることができます。潜在的な問題は、オブジェクトの削除後、同じアドレスに別のオブジェクトが割り当てられ、バグが発生する可能性があることです。- 無効なポインタを使用している可能性のあるすべての場所に通知できました。そのような場所の数は時間の経過とともに増加し、これを行うのは苦痛なので、それは悪い考えです。
- スマートポインタのいくつかのバージョンを実装することはできますが、どれを使用するかがわかりません。
tl; drバージョン:ポインタがオブジェクトを指しているのか、メモリの空きチャンクを指しているのか、または元のオブジェクトの削除後に割り当てられた他のオブジェクトを指しているのかを教えてくれるソリューションが必要です。