他の回答で述べたように、スマートポインターを使用する方が簡単ですが、この場合、削除を別の場所に置くことができます。
すべてのプレーヤーが に渡された場合World
、メモリを処理できます。 aが破壊さWorld
れるたびに、または別のプレーヤーが設定されるたびに、保持されている を削除する必要があります。また、プレーヤーは他の場所で破壊されるべきではありません。そうしないと、2 回破壊される可能性があります。ただし、この場合、すべての Player をメソッドによって構築して、誰がメモリ管理を所有しているかを明確にし、同じクラスで Player オブジェクトの作成と破棄を行うようにします。World
Player
World
World
いくつかの非常に不完全なコードがあります (スマート ポインター コードがはるかに少なく、すべてのケースをカバーしていると思います - これはそうではありません)。
class World
{
Player *p;
...
}
World() : p(nullptr) {
...
}
~World() {
delete p;
}
void World setPlayer( Palyer *aP ) {
if ( p != aP) {
delete p;
}
p = aP;
....
}
Player* World::createPlayer(std::string const& name){
return new Player(name);
}
Note= Player(name)
はスタック上に Playeobject を作成しますが、これは new と delete によってコード内で管理されません。ここでの最良の解決策かもしれません。
また、operator= とコピー コンストラクターを処理する必要があります (後者の場合は、呼び出されないようにするか、Player オブジェクトを複製する必要があるため、Original World とコピーの両方が同じ Player を削除しようとすることはありません)。