0

我正在用 C 语言做解释器,但我的引用计数有问题。

每个value(这是解释器的表示......一个值)都分配有refcount0。一旦它被添加到堆栈中,它就会增加refcount.

从堆栈中取出的唯一方法是将其value从堆栈中弹出,但这会导致问题。我的弹出函数返回value弹出的值,但如果refcount是 0 并且我破坏了该值,我将无法再返回它。

我知道我可能应该把refcount支票放在其他地方,但这看起来很难看,因为有很多地方使用弹出功能。

我可以做些什么来解决这个问题?在这种情况下是否需要实现真正的 GC 算法?

4

3 回答 3

1

我使用我自己的数据库系统,它也使用一种引用计数。

当一个对象被存储到数据库中时,它的引用计数就会增加。当我从数据库中获取一个对象时,它的引用计数保持不变。仅当以任何方式删除对象时(通常是删除包含它的数据库或将其替换为包含它的数据库中的另一个对象),它才会递减。只有当它的 refcount 等于 0 并且需要删除它时,该对象才真正被销毁。

于 2015-06-29T10:01:45.917 回答
0

每当您在案例中创建对象或值时,都应将 refcount 设置为 1。在推入堆栈时,将其递增。在弹出时,递减。在弹出每个操作时递减并检查 refcount,如果 refcount 为零,则销毁值。哪个函数 destoy-value 已经在做,所以你只需要在 pop 上调用那个函数。

于 2015-06-29T10:19:33.163 回答
0

作为一般规则,在创建引用时增加计数,在删除引用时减少计数。但是还有第三种类型的交易(或两者的优化组合),其中只有转账,您根本不更改计数。

如果您从堆栈中弹出值并且他们继续使用该值(可能在局部变量中),就会出现这种情况。首先对象在堆栈上,现在它在一个变量中;但仍然只有一个对象。在您完成并准备放弃引用之前,引用计数不会改变。

于 2015-07-09T08:45:00.007 回答