在内存管理语言中丢弃不再需要的对象的最佳做法

时间:2017-07-16 21:46:31

标签: oop memory-management

让我们说我们有一个顶级对象,例如在游戏中代表游戏世界中的某些物理内容。然后顶级对象拥有多个子对象,如边界框,图形对象等。我自己的意思是当它死了所以它应该是它的子对象。

还可以说,有一个图形管理器对象可以跟踪所有现有的图形对象,以便绘制它们。

现在让我们说顶级对象离开游戏世界,它被摧毁或者我们加载另一个级别,无论如何。我们现在可以删除它的引用,它将被GCed,但它拥有的图形对象仍然在图形管理器中引用它。因此需要一些机制来通知图形管理器删除它对图形对象的引用。这是我要问的机制。

我能想到的最好的方法是每个对象都需要一个公共alive布尔标志和任何其他不拥有它但与它交互的对象,可能需要保持对它的引用然后需要逻辑检查该标志并删除它的引用,如果它是错误的。但这对我来说似乎是一个相当不优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

你的想法不仅不优雅;它也不是好的OOP 。你要做的最后事情是公开一个类的字段;并且外部类取决于该字段的内容。

这直接违反了Tell Don't Ask原则。 应该是内部的;你不公开 - 尤其不是为了其他对象根据这种状态做出决定。当然:大多数语言都不允许您在字段上进行同步 - 这意味着这种方法会在整个地方尖叫竞争条件(当不同的线程正在读取/写入时那个领域)。您可以通过使字段 volatile (如果您的语言允许)来缓解此问题。

另一种方法是研究observer模式。含义:图形管理器将自己注册为侦听器;例如,在一个中央游戏经理" - 实际负责添加/删除游戏对象的一个​​组件。每次游戏管理器添加/删除对象时,图形管理器都会收到通知并可以调整其数据结构。

相关问题