首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对象应该在C++中自行删除吗?

对象应该在C++中自行删除吗?
EN

Stack Overflow用户
提问于 2009-02-06 23:17:49
回答 8查看 21K关注 0票数 24

我在C#工作了4年,所以我对当前C++的最佳实践和通用设计模式很感兴趣。考虑下面的部分示例:

代码语言:javascript
复制
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是唯一知道何时耗尽的对象,所以目前我让它自行删除。引发火灾的物体可能不再存在或相关。

这是一件明智的事情,还是有更好的设计来帮助清理这些对象?

EN

回答 8

Stack Overflow用户

发布于 2009-02-06 23:42:04

您已经将Update设置为虚函数,这表明派生类可能会覆盖Update的实现。这带来了两大风险。

1.)被覆盖的实现可能记得执行World.Remove,但可能忘记了delete this。内存泄露了。

2.)被覆盖的实现调用基类Update,后者执行delete this,然后继续执行更多的工作,但带有无效的this指针。

考虑这个例子:

代码语言:javascript
复制
class WizardsFire: public Fire
{
public:
    virtual void Update()
    {
        Fire::Update();  // May delete the this-object!
        RegenerateMana(this.ManaCost); // this is now invaild!  GPF!
    }
}
票数 30
EN

Stack Overflow用户

发布于 2009-02-06 23:29:36

在C++中删除对象本身并没有什么问题,大多数引用计数的实现都会使用类似的东西。然而,它被视为一种有点深奥的技术,您需要密切关注所有权问题。

票数 6
EN

Stack Overflow用户

发布于 2009-02-06 23:33:43

我更喜欢更严格的所有权模式。世界应该拥有它里面的东西,并负责清理它们。或者让world remove这样做,或者让update (或另一个函数)返回一个指示应该删除对象的值。

我还猜测,在这种类型的模式中,您将希望引用计数您的对象,以避免以悬空指针结束。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/522637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档