我在C#工作了4年,所以我对当前C++的最佳实践和通用设计模式很感兴趣。考虑下面的部分示例:
class World
{
public:
void Add(Object *object);
void Remove(Object *object);
void Update();
}
class Fire : Object
{
public:
virtual void Update()
{
if(age > burnTime)
{
world.Remove(this);
delete this;
}
}
}
在这里,我们有一个世界,负责管理一组对象并定期更新它们。火是在许多不同情况下可以添加到世界中的对象,但通常是由世界上已经存在的另一个对象添加的。Fire是唯一知道何时耗尽的对象,所以目前我让它自行删除。引发火灾的物体可能不再存在或相关。
这是一件明智的事情,还是有更好的设计来帮助清理这些对象?
发布于 2009-02-06 23:42:04
您已经将Update
设置为虚函数,这表明派生类可能会覆盖Update
的实现。这带来了两大风险。
1.)被覆盖的实现可能记得执行World.Remove
,但可能忘记了delete this
。内存泄露了。
2.)被覆盖的实现调用基类Update
,后者执行delete this
,然后继续执行更多的工作,但带有无效的this指针。
考虑这个例子:
class WizardsFire: public Fire
{
public:
virtual void Update()
{
Fire::Update(); // May delete the this-object!
RegenerateMana(this.ManaCost); // this is now invaild! GPF!
}
}
发布于 2009-02-06 23:29:36
在C++中删除对象本身并没有什么问题,大多数引用计数的实现都会使用类似的东西。然而,它被视为一种有点深奥的技术,您需要密切关注所有权问题。
发布于 2009-02-06 23:33:43
我更喜欢更严格的所有权模式。世界应该拥有它里面的东西,并负责清理它们。或者让world remove这样做,或者让update (或另一个函数)返回一个指示应该删除对象的值。
我还猜测,在这种类型的模式中,您将希望引用计数您的对象,以避免以悬空指针结束。
https://stackoverflow.com/questions/522637
复制相似问题