我正在用 C++ 编写一个用于编程语言的 VM。该语言是垃圾收集的,因此我在垃圾收集堆中分配了 C++ 类的实例。我正在使用复制收集器,因此当发生 GC 时,这些对象会在内存中移动。这意味着需要更新指向该对象的每个指针。这些指针中的大多数都很容易处理,除了一个棘手的指针:this
. 考虑:
class SomeObj : public Managed // inheriting from this means it's on the GC heap
{
public:
void method()
{
SomeObj* other = new SomeObj(); // could trigger a GC.
printf("%d\n", someField); // this points to wrong memory
}
private:
int someField;
};
如果我处于 GC 堆上的某个对象的实例方法的中间,则this
指向一些 GC 内存。在此方法的中间可能会发生集合。发生这种情况时,对象将被移动到新位置。但是,由于我们处于方法调用的中间,this
仍然指向旧的错误位置。
我可以通过不在托管内存中的类上使用实例方法来解决这个问题,但我确实喜欢这样代码更简单。有什么技术可以解决这个问题吗?