2

分配的结构“对象”的引用计数的基础知识对我来说似乎很简单:给新对象的 RC 为 1;分配时减少旧对象的 RC(如果 RC=0,则释放)并增加分配对象的 RC;减少所有离开范围的对象的 RC。

但是,当将 RC 对象传递给函数/从函数返回时,我对我需要做什么感到有点困惑。我是否必须在每个函数调用之前/之后对 RC 进行 inc/dec,如果有必要,应该将 inc 和 dec 放在哪里(在函数内部的开始和结束处,还是在函数调用之前和之后?)?函数返回的 RC 对象呢?

4

3 回答 3

3

增加引用计数就像在说“我对指向的内容感兴趣,所以我已经将指针存储在某个地方。请不要在我不看的时候释放它”。

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

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

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

于 2013-01-05T13:42:13.820 回答
3

一般来说,任何时候创建一个新的引用,你都会增加,每次销毁/丢弃一个引用,你就会减少。

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

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

于 2013-01-05T13:42:20.940 回答
0

我认为功能是一样的。
如果你传递了一个指向函数调用的指针,你为什么不把它当作一个赋值呢?(所以我认为 RC 应该递增)
当你离开函数时,我认为它与离开作用域相同。
关于返回值,如果是用来赋值的,那么如你所说,RC+1,或者RC就不用改了。

于 2013-01-05T13:50:07.573 回答