什么时候使用“删除这个”是否合适?

时间:2009-06-24 22:34:29

标签: c++ memory-management

  

可能重复:
  Should objects delete themselves in C++?

在我的应用程序中,我创建了许多“拥有自己”的对象 - 在创建它们并告知它们“go”后,只有对象本身可以确定何时应该删除它。

例如,如果我正在编写游戏,我可能会有多个Enemy个对象。只有Enemy对象知道它应该何时死亡。

结果,我最终在delete this对象内的一些成员函数中使用了Enemy。这是不好的形式?这是我应该避免的,如果是这样,处理这种情况的正确方法是什么?

9 个答案:

答案 0 :(得分:5)

需要注意的是,如果有太多的成员函数将自删除作为副作用,则在删除对象后很容易意外使用对象的引用。

避免这种情况的一种方法是推迟删除 - 也就是说,将对象放在列表中,并从游戏的主循环中删除列表开头/结尾处列表中的所有内容。

答案 1 :(得分:3)

取决于内存管理策略。有些情况下它确实有意义,这是正确的。例如,在像COM这样的引用计数系统中,当refcount降为零时,对象将执行delete this

答案 2 :(得分:3)

For example, if I was writing a game, I might have multiple Enemy
     

对象。只有敌人的对象知道   什么时候应该死。

敌人物体可能知道何时进入“死亡”状态,是的。但这不一定与“应该删除对象”相同。

想想可能引用它的所有其他对象?他们可能在任何时候尝试调用Enemy对象上的函数(比如TakeDamage()),如果删除了对象而没有通知它们,那么你可能会崩溃。他们怎么知道他们射击的敌人已经死了?

所以Enemy对象知道它什么时候死了,但不知道什么时候应该删除它。它不属于自己。

拥有它呢?

游戏世界可能是一个不错的选择。当敌人死亡时,它向游戏世界发送一条消息说它已经死了,然后游戏世界可以负责确保没有人拥有指向它的指针,最后,当它安全时,删除对象。

答案 3 :(得分:0)

抽象地说,我认为您不希望删除自身的对象。

你想要做的是创建一个控制结构,从对象中检索一个SIGNAL或消息,它是时候“死”,在这种情况下,控制结构将“删除”或采取特定的必要操作对象

这样,您可以将对象的控制权保留在控制结构中,并且当所有对象都有集中控制单元时,您可以防止对已删除对象的潜在调用。

另外,请记住区分正如你所说的“死”的士兵和实际上从记忆中“删除”的对象。垂死部分,对象本身可以通过设置标志来完成,例如“dead = true”。但是从内存中删除对象应该由我所指的控制结构来完成。

答案 4 :(得分:0)

对我来说这似乎很奇怪,我自己会更喜欢某人或其他东西摆脱它们。害怕某人引用这个物体对我来说是可怕的。 “儿童”方法似乎也很有可能无意中破坏了对象。当您返回更高级别的方法时:您正在使用不存在的对象进行操作。

听起来你正在发明引用计数,或许明确地使用引用计数模式。

或让对象将自己添加到“待销毁”列表中 - 您自己就拥有了垃圾收集系统。

答案 5 :(得分:0)

只要敌人管理对它们的所有引用(例如单位列表,组中的单位列表等)就可以了(并经常使用)。

但是如果你想要更安全的一面,敌人应该在程序执行中的某个“安全点”注册自己的某些破坏程序(例如,请参阅Qt中的QObject::deleteLater()

答案 6 :(得分:0)

您可以将shared_ptrs用于对象,以便在没有对它们的引用可用时自动清理它们。

或者在课堂上调用析构函数。

答案 7 :(得分:0)

说实话,你应该试图远离那个。否则你可能会删除其他东西使用的东西,并通过一个非常奇怪的结果完成,并可能有一些内存泄漏。

我认为对象应该在析构函数中删除它的资源。你的班级应该使用另一个班级知道敌人何时死亡。

答案 8 :(得分:0)

引用对象应该删除,并且应该通过询问对象是否满足删除条件来执行此操作。其中一个条件(除了在游戏中被淘汰之外)还有多少其他对象仍然引用该对象。这是可以使用静态引用计数跟踪的内容。一般来说,如果你仔细地写它,你可能能够以这样一种方式构建它,即只在你的游戏循环中的一个地方跟踪敌人。那个地方将检查冲突和其他条件,当它准备删除对象时,它不必询问删除是否正常,因为它知道它是唯一的客户端,并且可以安全地取消引用它分配的内容。