如其他答案所述,使用智能指针更容易,但是在这种情况下,您可以将删除放在其他地方。
如果所有玩家都传递给 aWorld
然后World
可以处理内存 - 每次 aWorld
被破坏或设置不同的玩家时Player
,World
必须删除持有的。此外,任何玩家都不应该在其他任何地方被摧毁,否则它可能会被摧毁两次。但是在这种情况下,我会让所有 Players 都由一个方法构造,World
以明确谁拥有内存管理并保持同一个类创建和销毁 Player 对象
一些非常不完整的代码是(注意智能指针代码要少得多,我认为涵盖了所有情况 - 这不是)
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);
}
注意= Player(name)
在堆栈上创建了一个 Playeobject,并且不在您的代码中由 new 和 delete 管理 - 这可能是这里最好的解决方案。
还需要处理 operator= 和复制构造函数(后者最好阻止它被调用,否则它将需要复制 Player 对象,因此删除原始世界和副本不会尝试删除同一个 Player)