问题标签 [refcounting]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
530 浏览

c++ - 引用计数智能指针如何避免或处理引用计数器溢出?

在一个简单的引用计数智能指针实现中,引用计数器可能会溢出。在 C++ 标准库实现中如何避免或处理这种溢出?

0 投票
1 回答
5021 浏览

c++ - 如何正确异步使用grpc(ClientAsyncReaderWriter)

我找不到显示如何使用 ClientAsyncReaderWriter 的 grpc 示例(有吗?)。我自己尝试了一些东西,但是在引用计数方面遇到了麻烦。我的问题来自跟踪代码。

struct grpc_call有一个gpr_refcount名为的类型的成员ext_ref。ClientContext C++ 对象包装了 grpc_call,并将其保存在一个成员grpc_call *call_;中。只有 ext_ref 为 0 时,才能删除这个 grpc_call 指针。

当我与ClientReader同步使用 grpc 时:

  • 在其实现中,它使用 CreateCall() 和 PerformOps() 添加到 ext_ref ( ext_ref == 2)。
  • 然后我使用 Pluck() 从 ext_ref 中减去 ( ext_ref == 1)。
  • 最后使用 ~ClientContext() 从 ext_ref 中减去,因此ext_ref == 0并删除调用

但是当我与 ClientAsyncReaderWriter 异步使用grpc时:

  • 首先使用 asyncXXX(),此 API 使用 CreateCall() 并注册 Write() ( ext_ref == 2)。
  • 然后它使用 AsyncNext() 来获取标签...必须使用写入或读取运算符。
  • 所以ext_ref > 1永远,除非 got_event 你不处理。

我这样称呼它:

注册线程

获取 CompletionQueue 事件线程

0 投票
1 回答
92 浏览

rust - 从 Box 切换到 Rc对于类似 Scheme 的 Cons 列表无法编译

Rc如果替换为 ,下面的程序编译并运行Box。为什么使用引用计数时不编译?这是一个关于 和 的区别的Rc<T>问题Box<T>

0 投票
2 回答
115 浏览

c - 如何避免释放存储在具有相同引用计数的容器中的对象

我一直在研究用 c 编写的自定义编程语言的一些特性。目前,我正在开发一个系统,该系统对语言中的对象进行引用计数,在 c 中,这些对象表示为结构,其中包括引用计数。
还有一个功能可以释放所有当前分配的对象(比如在程序退出之前清理所有内存)。现在这正是问题所在。

我一直在考虑如何做到最好,但我遇到了一些问题。让我勾勒一下情况:

分配了 2 个新整数。两者的引用计数均为 1
分配了 1 个新列表,引用计数也为 1

现在两个整数都进入列表,在这些操作之后,它们的引用计数为 2
两个整数由于某种原因超出范围,因此它们的引用计数下降到 1,因为它们仍在列表中。

现在我已经完成了这些对象,所以我运行该函数来删除所有跟踪的对象。但是,您可能已经注意到列表和列表中的对象都具有相同的引用计数 (1)。这意味着无法决定首先释放哪个对象。

如果我要释放列表之前的整数,则列表将尝试减少之前释放的整数的引用计数,这将导致段错误。

如果列表在整数之前被释放,它会将整数的引用计数减少到 0,这也会自动释放它们,并且不需要采取进一步的步骤来释放整数。他们不再被追踪。

目前我有一个大部分时间都可以工作的系统,但不适用于我上面给出的示例,我根据对象的引用计数释放对象。最高计数最新。这显然只适用于整数的引用计数高于上面示例中可见的列表的情况,但并非总是如此。(仅在整数没有超出范围的情况下才有效,因此它们的引用计数仍然高于列表)

注意:我已经找到了一种我真的不喜欢的方法:向每个对象添加一个标志,表明它在一个容器中,所以不能被释放。我不喜欢这样,因为它为每个分配的对象增加了一些内存开销,并且当存在循环依赖时,不会释放任何对象。当然,循环检测器可以解决这个问题,但最好我只想通过引用计数来做到这一点。

让我举一个上述步骤的具体例子:

当然应该发生的是 100% 的时间,列表在整数之前被释放。

释放所有现有对象的更聪明的方法是什么,使得存储在容器中的对象在它们所在的容器之前不会被释放?

0 投票
1 回答
353 浏览

python-3.x - Cython:将 C 结构转换为 pythons 对象会增加引用计数

我正在尝试将 C 指针结构强制转换为对象类型,同时,无论该字段是什么类型,该结构的第一个字段都将递增 1。这种行为是预期的,我不应该将 C 指针转换为对象,或者 Cython 有问题吗?

示例代码:

C结构:

赛通:pxd:

皮克斯:

当创建 Attr 并运行 attr 方法时,t struct 的“a”字段正在递增(此示例只是我试图不运行的示例)感谢您的帮助

0 投票
1 回答
179 浏览

python - 需要有关引用计数的指导

我正在寻找似乎来自一个长时间运行的进程的内存泄漏,该进程包含我编写的 C 扩展。我一直在研究代码和扩展文档,我确信它是正确的,但我想确保关于 PyList 和 PyDict 的引用处理。

从文档中我收集到 PyDict_SetItem() 借用了对键和值的引用,因此我必须在插入后对它们进行 DECREF。PyList_SetItem() 和 PyTuple_SetItem() 窃取对插入项的引用,因此我不必 DECREF。正确的?

创建一个字典:

创建列表:

parse_* 函数不需要额外的审查:它们只在最后一行创建对象,如下所示(例如):

如果他们遇到错误,他们不会创建任何对象,而是在函数体的前面设置一个异常:

编辑

这是 valgrind --leak-check=full 的一些输出。显然这是我的代码泄漏内存,但为什么呢?为什么 PyDict_New 位于(递归)链的顶部?这是否意味着当整个事情被垃圾收集时,这里创建的字典不会得到 DECREF'd?

在这里要清楚一点:当我在 C 中构建 Python 类型的嵌套数据结构,然后 DECREF 最顶层的实例时,Python 将递归地 DECREF 结构的所有内容,不是吗?

0 投票
1 回答
81 浏览

python - C-Extension:生成器的参考计数

我正在尝试让我的 c 扩展名的Py_INCREF's 和Py_DECREF's 正确。在这样做的同时,我一直在为发电机的真正高价值而磕磕绊绊。我一直在做的事情如下:

有人可以解释一下吗。

0 投票
0 回答
50 浏览

python - 当引用计数为零时,内存真的被回收了吗?

那么“list”对象的内存在打印后是否会在 for 循环开始执行之前立即释放?

0 投票
2 回答
73 浏览

python - 如果对对象的引用递增/递减,则覆盖哪个函数

我对 Python 有一个非常基本的疑问。当对象的引用计数增加时,是否有一个函数被调用?

我确信应该有一个双下划线方法,我可以在我的类中重写。基本上我正在寻找 Foo 类中的ref方法。

PS:我知道sys.getrefcount

0 投票
1 回答
26 浏览

c - GLib 中的 GRefString 实现是什么?

我想知道引用计数存储在哪里?由于类型定义为:

并且所有g_ref_string*…()函数都简单地返回gchar *,而不是一个可以保存引用计数的结构。在指向内存sds之前保存元数据头结构是库的技巧吗?char *恐怕这种实施在某些时候会适得其反,对吗?即:使用这种带有前置头的字符串时会出现什么问题?