问题标签 [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 回答
652 浏览

reference-counting - 使用 RefCounted!(T) 在 D 中创建引用计数对象

你如何std.typecons.RefCounted!(T)在 D 中创建一个引用计数的对象?

我试图通过查看源代码来弄清楚std.array.Array内部是做什么的,但是虽然我可以阅读源代码,但我只是无法弄清楚“有效负载”是什么,或者当涉及到按位结构复制之类的事情时它是如何工作的,以及为什么有些东西在内部和外部结构中是重复的。

谁能提供一个示例或链接来说明如何使用它来包装一个简单的 Win32 HANDLE

谢谢!

0 投票
2 回答
758 浏览

c++ - 关于线程安全引用计数的另一个问题

关于如何实现线程安全引用计数器有很多问题。一个常见的高度投票的答案是:“使用原子增量/减量”。好的,这是读取和写入 refCounter 的好方法,无需其他线程在其间更改它。但。

我的代码是:

所以。我递减并安全读取 refCounter。但是,如果其他线程在我将其与零进行比较时会增加我的 refCounter 怎么办????

我错了吗?

编辑:(示例)

我错了吗?

0 投票
3 回答
468 浏览

python - 为什么我的 C 模块会泄漏内存?

我正在从一个大文件中读取列表,我最终希望将其存储为array.arrays. 因为

非常慢,我写了一个小的 C 模块,它执行 strtok 和更快的 atoi 版本:

因此,我的 python 脚本ints()使用字符串调用并将其传递给array.array构造函数并将生成的数组保存在list.

我的问题是,现在脚本泄漏了内存,当然,它没有使用地图而不是ints()函数。

同样使用我自己的使用 C 模块的 Python 版本int()不会泄漏内存。

谢谢你的帮助!

编辑: 要验证我使用此脚本的模块:

我跑了,但是在和valgrind --tool=memcheck --leak-check=full --show-reachable=yes python test.py之间没有来自 valgrind 的输出,之前和之后都有很多。startstop

编辑:确认泄漏的代码:import minhashTables

我必须重新创建字符串,因为 strtok 更改了它。顺便说一句,将字符串复制到另一个内存位置不会改变行为。

0 投票
1 回答
394 浏览

c++11 - (Ab) 使用 shared_ptr 作为引用计数器

最近我想到了一个狡猾的计划(tm:P))我必须在我的程序中更新设置结构(比如说每 15 秒)。设置结构被多个函数使用,每个函数都被多个线程调用。所以我需要一个引用计数器来知道何时可以安全地释放旧的设置结构。那么这是正确的方法吗?请不要回答说如果你没有仔细阅读代码就可以了,当涉及到共享指针时,在做这样的滥用时很容易出错(相​​信我)。编辑:我忘了提到重要的部分。我认为这个实现可以防止 ref 计数器下降到 0,因为我在 updateSettings() 中对其进行了初始化,并且在再次调用它之前它不会下降(然后 myFucntion 使用内存中的 2 个设置中的另一个)。

编辑:使用来自我更新代码的评论的反馈:

0 投票
2 回答
145 浏览

iphone - 多次加载笔尖后无法释放

我使用 Nib 作为几个按钮的模板。它似乎工作正常,他们每个人都有自己独立的状态。但是,当我去释放按钮时,我会在 dealloc 中崩溃。这是代码...

标题:

Nib 非常简单,它只包含一个自定义视图类型的父视图和一个子视图。 笔尖

cSoundButton 只跟踪名称和布尔状态 Mute or Not。这是dealloc

崩溃是在 UIButton -> UIButtonContent dealloc 中对 super dealloc 的调用。我假设我的内存管理做得很差,比如释放两次,但我不知道在哪里。

我通过多次加载笔尖来做的事情合法吗?

0 投票
1 回答
591 浏览

php - 函数参数上的奇怪 xdebug_debug_zval 行为——显示的引用计数不正确 (?)

这是代码:

输出是:

因此,问题是:为什么它不在b: (refcount=2,..)输出的前两行?

请注意,由于在内部传递变量,不应添加额外的引用xdebug_debug_zval,因为 (1) 变量实际上并未传递,并且 (2) http://www.xdebug.org/docs/上的文档all_functions明确表示:

void xdebug_debug_zval( [string varname [, ...]] )

显示有关变量的信息

此函数显示有关一个或多个变量的结构化信息,包括其类型、值和引用计数信息。使用值递归地探索数组。该函数的实现方式与 PHP 的 debug_zval_dump() 函数不同,以便解决该函数所存在的问题,因为变量本身实际上是传递给函数的。Xdebug 的版本更好,因为它使用变量名在内部符号表中查找变量并直接访问所有属性,而无需处理实际将变量传递给函数的问题。结果是这个函数返回的信息比 PHP 自己的显示 zval 信息的函数要准确得多。

是必须处理 XDebug 参数还是 XDebug 本身的怪癖?

PS我phpinfo()的是(PHP 5.3.3,XDebug 2.1.1,Ubuntu 10.10):

0 投票
1 回答
324 浏览

perl - Perl 中的递归引用

我正在阅读的书说在这种情况下$a永远不会免费,我的问题是为什么 perl 解释器不在编译时修复它?当它发现它指向自己时,不要增加引用计数。

为什么 perl 不这样做?

0 投票
8 回答
21855 浏览

c++ - 计算对象实例的最简单方法

我想知道在某个执行点分配的某些对象的确切实例数。主要是为了寻找可能的内存泄漏(我主要使用 RAII,几乎没有新的,但在添加新元素或类似的东西之前我仍然可以忘记向量上的 .clear())。Ofc 我可以有一个

我 - 在析构函数中,++ 增加构造函数,cpy 构造函数(我希望我涵盖了所有内容:))。但这是每个班级的硬编码。在“发布”模式下禁用它并不简单。那么有没有什么简单优雅的方法可以很容易地禁用来计算对象实例呢?

0 投票
2 回答
228 浏览

delphi - 缓慢的内存释放(引用结构) - 我的解决方法是一个好方法吗?

在我的程序中,我可以加载目录:Icatalog

此处的目录包含很多引用结构(Icollections of IItems、IElements、IRules 等)

当我想更改到另一个目录时,我加载了一个新目录,但前一个 IDatalog 实例的自动释放需要时间,我的应用程序冻结了 2 秒或更长时间。

我的问题是:

我想将旧的(不再使用的)ICatalog 实例的发布推迟到另一个线程。

我还没有测试过,但我打算创建一个新线程:

这样,我希望发布发生在线程中,并且我的应用程序不再冻结。

它安全(和良好的做法)吗?
您是否有已经使用类似方法执行发布的现有代码示例?

0 投票
1 回答
556 浏览

python - 如何以最简单的方式在 Python C 扩展中调试引用计数?

因此,我整理了一些 Python C 扩展,虽然它们各自的行为已经过验证,但我想通过一些 refcount 调试来验证这一点。

如何验证我是否正确插入了 INC/DEC 引用计数?我想从黑盒的角度来做这个验证,也就是说,如果所有的引用计数都正确完成,函数的输入/输出/内存应该如何?

我的第一种方法是使用 sys.getrefcount(obj) 并检查所有输入/输出对象的引用计数以查看它们是否正常。其次,我也许还可以检查用于查看没有内存泄漏的内存。

但是我以前从未真正这样做过,那么最简单,最正确的方法是什么?

请注意: 我不想使用任何 Cython 样式库,我宁愿自己做 C nitty gritty 来学习基础知识。

解决方案:所以按照建议,我构建了一个启用调试的 Python 解释器。我以为这会很棘手,但事实并非如此。根据这个食谱,我将这些确切的行添加到Objects/object.c. 之后,我在下载的 Python 源目录中要做的就是:

关于为这个新解释器构建 C 扩展,在这方面必须做的就是include_dirs将扩展中的标记setup.py指向'/usr/local/python/include/python2.7',然后使用新解释器运行构建和安装命令。完成后,我只需在 c 代码中添加_Py_CountReferences(stderr);行,引用计数将转储到 stderr(控制台)。很高兴看到引用计数发生了什么变化,以及随着代码的进行它如何增加/减少。