You have made Update
a virtual function, suggesting that derived classes may override the implementation of Update
. This introduces two big risks.
1.) An overridden implementation may remember to do a World.Remove
, but may forget the delete this
. The memory is leaked.
2.) The overridden implementation calls the base-class Update
, which does a delete this
, but then proceeds with more work, but with an invalid this-pointer.
Consider this example:
class WizardsFire: public Fire
{
public:
virtual void Update()
{
Fire::Update(); // May delete the this-object!
RegenerateMana(this.ManaCost); // this is now invaild! GPF!
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…