如何在C参数传递中引用计数

时间:2013-01-05 13:34:00

标签: c memory-management memory-leaks reference-counting

对于我来说,分配的struct'对象'的引用计数的基础知识看起来非常简单:给新对象一个RC为1;在赋值时递减旧对象的RC(和RC = 0时自由)并递增指定对象的RC;减少离开范围的所有对象的RC。

然而,当RC'ed对象传递给函数/从函数返回时,我有点困惑我需要做什么。我是否必须在每次函数调用之前/之后加入/减去RC,如果有必要(在函数内部的开始和结束时或函数调用之前和之后?),应该将inc和dec放在何处?函数返回的RC对象怎么样?

3 个答案:

答案 0 :(得分:3)

增加引用计数就像是说“我对要点有什么感兴趣,所以我把指针存放在某个地方。请不要在我看的时候释放它。”

因此,每次存储指针都是“引用”,必须计算。

如果函数没有将指针存储在某处,则不需要递增它。 如果存储指针,则在完成使用后,减少引用计数。\

通常情况下,将返回一个“对象”,其引用计数已设置为1.您必须阅读该函数文档以了解它是否已“通过了对您的所有权”(在这种情况下,您将必须减少计数),或者如果还有一些其他函数需要调用它将减少它并删除对另一个对象内部的指针的引用。

答案 1 :(得分:2)

一般来说,无论何时创建新引用,您都会递增,每次销毁/丢弃时,您都会减少。

函数参数需要一个副本,因此这是一个增量。函数返回值需要一个副本,因此这是一个增量。当然,在许多情况下,也会有相应的同时丢弃,因此您可以通过不修改计数来进行优化。

当然,在C语言中,这可能非常快速地变得非常复杂且容易出错,因为您必须手动完成所有操作。一个破碎/不可靠的引用计数机制可能比没有更糟糕。

答案 2 :(得分:0)

我觉得功能是一样的 如果你传递了一个指向函数调用的指针,为什么不把它当作一个赋值?(所以我认为RC应该增加)
当你离开这个功能时,我认为这与离开范围是一样的 关于返回值,如果它用于赋值,那么如你所说,RC + 1或RC不需要改变。