0

我在 Flash 中工作,并尝试使用 Flash Player 中可用的新“域内存”。这实质上可以让您在低级别使用内存,但您必须自己管理内存,就像没有内置垃圾收集器的 C++ 一样。我已经构建了一个基本的分配器/释放器,但我需要一些方法来构建垃圾收集器或引用计数器,以便我可以取消分配未使用的对象。举个例子:

Rect stageRect = new Rect(0, 0, stage.width, stage.height);
  // syntax is for understanding only
  // actually would allocate memory using my handwritten allocator

我已经构建了一个新的Rect并存储在一个类成员变量中。现在假设我对这个对象执行一些矩形数学运算,再创建 2 个对象。

Rect quarterRect = stageRect.halfWidth().halfHeight();

如您所见,Rect返回的 byhalfWidth是未使用的,可以进行垃圾收集。

由创建的最终矩形halfHeight存储在 varquarterRect中,我稍后需要它。

如何检测这些未使用的对象,并相应地处理它们?我一直在阅读Reference Counting、Smart Pointers和 C++的GC,但我仍然不知道如何检测何时未使用引用,以减少引用计数。增加引用计数很容易:当您设置另一个 var 指向该对象时,即:a = stageRect,应该增加 的引用计数stageRect,但是您怎么知道什么时候a未使用?减少引用计数?通常你不会a = null在现代代码中设置。您只是希望平台能够检测到它未使用的 ref 并处理它。

4

1 回答 1

1

好吧,让我们考虑一下这段代码:

int someFunction() { // I have no clue about AS3 syntax, but I suppose it's C-like, right?
    Rect a = new Rect(...); // there are no pointers, only references, right?

    // ... some other stuff
} // <- what happens here?

右花括号会发生什么?a变量超出范围。在 C++ 中,当变量超出范围时,会调用其析构函数。当变量超出范围时,AS3 中会发生什么?如果这里什么都没有发生,那么您就无法以编程方式跟踪任何事情......好吧,那么恐怕实现引用计数是不可能的。对于引用计数,您需要一种方法来判断对您的值的引用已经消失。

但是AS3真的没有GC吗?我无法相信没有 GC 的脚本语言。

于 2013-01-16T06:46:13.280 回答