在C

时间:2015-06-29 09:51:23

标签: garbage-collection interpreter refcounting

我正在用C语言翻译,我的引用计数有问题。

每个value(它是一个值的解释器的表示形式)都被赋予refcount 0.一旦它被添加到堆栈,它就会增加{{1 }}

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

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

我该怎么做才能解决这个问题?在这种情况下是否需要实现真正的GC算法?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

无论何时在您的情况下创建对象或值,都应将refcount设置为1.在推送到堆栈时,递增它。在弹出,减少。在弹出每个操作递减并检查引用计数,如果引用计数为零则销毁值。哪个函数的destoy-value已经在执行,所以你只需要在pop上调用该函数。

答案 2 :(得分:0)

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

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