C++ 如何构建垃圾收集器?

C++ 如何构建垃圾收集器?,c++,actionscript-3,memory-management,garbage-collection,reference-counting,C++,Actionscript 3,Memory Management,Garbage Collection,Reference Counting,我在Flash中工作,并试图使用Flash Player中提供的新“域内存”。这基本上可以让你在低级别上工作内存,但是你必须自己管理内存,就像C++一样,没有内置的垃圾收集器。我已经构建了一个基本的分配器/释放定位器,但是我需要一些方法来构建一个垃圾收集器或引用计数器,以便我可以取消分配未使用的对象。以以下为例: Rect stageRect = new Rect(0, 0, stage.width, stage.height); // syntax is for understanding

我在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
,并存储在一个类成员变量中。现在让我们假设我对这个对象执行一些矩形数学,创建了另外两个对象

Rect quarterRect = stageRect.halfWidth().halfHeight();
如您所见,
halfWidth
返回的
Rect
未使用,可以进行垃圾收集

halfHeight
创建的最后一个rect存储在var
quarterRect
中,我稍后需要它


如何检测这些未使用的对象,并相应地处理它们?我一直在阅读,但我仍然不知道如何检测引用何时未使用,以减少引用计数。增加引用计数很容易:当您设置另一个变量指向此对象时,即:
a=stagpright
,应该增加
stagpright
的引用计数,但是您如何知道
a
何时未使用?要减少引用计数?在现代代码中,通常不会到处设置
a=null
。你只是希望平台检测到它的未使用的REF并处理它。

< P>,让我们考虑这个代码:

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?
intsomefunction(){//我对AS3语法没有任何线索,但我认为它类似于C,对吗?
Rect a=new Rect(…);//没有指针,只有引用,对吗?
//…一些其他的东西

}//这可能是一个很好的解读:为什么不正确地释放分配的内存?正如我在上一个代码示例中所说的,我应该如何检测由
halfWidth
返回的
Rect
是否未使用?
a=null
正是需要做的事情。内置GC也是如此。TBH我怀疑编写自己的GC是否值得,除非您的应用程序必须手动释放内存。只要没有创建闭包,您就不应该对
C++
中的=null方法有问题,因为析构函数是在堆而不是堆栈上分配的。AS3有GC,但是当您手动管理内存时,您还必须手动实现GC。@GWW:Huh<代码> int f*){Rect*a=新ReCt(…);} /Cuth>,在结尾<代码> A/COD>被破坏-不是<代码> */> >,当然,这不是重点。JokyvVD:我猜我发现您的语法有点混乱,当您使用C++代码>新< /C> C++时,它在堆上分配。
a
将被声明为
Rect*
;从我从问题中得到的信息来看,AS3没有指针,只有引用。我还是不知道你想说什么。