问题标签 [reference-counting]
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.
c++ - 如何在 C++ 中实现线程安全引用计数
如何使用 C++ 编程语言在 X86 CPU 上实现高效且线程安全的引用计数系统?
我总是遇到关键操作不是原子的问题,可用的 X86 互锁操作不足以实现引用计数系统。
以下文章涵盖了该主题,但需要特殊的 CPU 指令:
delphi - 为什么不收集 TInterfacedObject 的后代垃圾?
我有一个基于 TInterfacedObject 的类。我将它添加到 TTreeNode 的 Data 属性中。
我创建了这个对象的许多实例并假设因为它们是引用计数的,所以我不需要释放它们。那会很方便。
但是,当检查这个时,我打开了 ReportMemoryLeaksOnShutdown 并发现它们毕竟没有被释放。
这些对象是在放置在主窗体上的框架中创建的。在主窗体的 FormClose 中,我清除树节点,以便释放每个对象。
发生了什么?
感谢您的帮助!
delphi - 如何在 Delphi 中实现引用计数对象
我有一个类似结构的图。我不确切知道何时以传统的 Delphi 方式销毁对象,相反我想实现类似引用计数对象之类的东西。我知道我可以使用 object.GetReference 和 object.Release 之类的东西来代替 Free,并使用私有变量进行引用计数,但有没有更好的方法?
谢谢
c++ - 在 C++ 中实现智能指针的最佳方法是什么?
我一直在评估各种智能指针实现(哇,那里有很多),在我看来,它们中的大多数可以分为两大类:
1) 此类别对引用的对象使用继承,以便它们具有引用计数,并且通常实现 up() 和 down()(或它们的等价物)。IE,要使用智能指针,您指向的对象必须从 ref 实现提供的某个类继承。
2) 此类别使用辅助对象来保存引用计数。例如,智能指针不是直接指向一个对象,而是实际上指向这个元数据对象……谁有引用计数和 up() 和 down() 实现(并且谁通常提供指针指向的机制获取指向的实际对象,以便智能指针可以正确实现运算符->())。
现在, 1 有一个缺点,它强制您希望引用 count 的所有对象都从一个共同的祖先继承,这意味着您不能使用它来引用您无法控制源代码的 count 对象到。
2 的问题是由于计数存储在另一个对象中,如果您曾经遇到将指向现有引用计数对象的指针转换为引用的情况,您可能有一个错误(IE,因为计数不在实际对象,新引用无法获取计数...引用到引用复制构造或赋值很好,因为它们可以共享计数对象,但是如果您必须从指针转换,您重新完全冲洗)...
现在,据我了解, boost::shared_pointer 使用机制 2,或类似的东西......也就是说,我无法完全决定哪个更糟!我只在生产代码中使用过机制 1……有人对这两种风格都有经验吗?或者也许还有另一种比这两种方法更好的方法?
c++ - Swig 和引用计数的 C++ 类
我的许多 C++ 对象通过 AddRef 和 FreeRef 方法实现了引用计数。如果 FreeRef 将引用计数减少到 0,则对象将删除其自身。
所有返回引用计数对象的方法都不会增加引用。这使得它变得简单,因为智能指针可以简单地在接收到指针时增加计数,并在它们不再引用它时减少计数。例如:
我在想也许我可以告诉 SWIG 只在内部使用我现有的智能指针来处理这些可能有效的对象,但是我也不知道该怎么做:(
c++ - 引用计数指针的 STL 类?
这应该是微不足道的,但我似乎找不到它(除非不存在这样的类!)
智能指针的 STL 类(或类集)是什么?
更新
感谢您的回复,
我必须说我很惊讶没有标准实施。
我最终使用了这个: http: //archive.gamedev.net/reference/articles/article1060.asp
c++ - 为什么 VC++ 字符串不被引用计数?
STL 标准不要求从 std::string 被引用。但事实上,大多数 C++ 实现都提供了引用计数、写入时复制的字符串,允许您将字符串作为原始类型按值传递。此外,这些实现(至少 g++)使用原子操作使这些字符串无锁且线程安全。
简单的测试显示了写时复制语义:
在使用非常量成员之后,仅打印两个地址。
我使用 HP、GCC 和 Intel 编译器测试了这段代码,得到了类似的结果——字符串作为写时复制容器工作。
另一方面,VC++ 2005 清楚地表明每个字符串都是完全复制的。
为什么?
我知道 VC++6.0 中有一个错误,它具有非线程安全的引用计数实现,导致随机程序崩溃。这是原因吗?他们只是害怕再使用引用计数,即使这是常见的做法?他们宁愿完全不使用引用计数来解决问题?
谢谢
c++ - 使用 shared_ptr 时如何检测循环
shared_ptr 是 Boost 库中的引用计数智能指针。
引用计数的问题是它不能处理循环。我想知道如何在 C++ 中解决这个问题。
请不要提出诸如“不要循环”或“使用弱点”之类的建议。
编辑
我不喜欢只使用 weak_ptr 的建议,因为显然如果你知道你会创建一个循环,那么你就不会有问题。如果您在运行时生成 shared_ptrs,您也无法知道在编译时会有一个循环。
因此,请自行删除其中使用 weak_ptr 的答案,因为我特别要求不要有那种答案......
delphi - 对象的引用计数
在我的代码中,我使用了一个在不同位置创建的小型数据存储类。为了避免内存泄漏和简化事情,我想使用引用计数,所以我做了
并删除了我对 TFileInfo.Free 的所有手动调用。不幸的是,Delphi 报告了很多内存泄漏。搜索 SO 我发现以下问题解释了为什么这不起作用:
为什么不收集 TInterfacedObject 的后代垃圾?
那里提供了一种解决方法,但它需要我(至少如果我做对了)编写自定义接口 IFileInfo 并为其提供很多我想避免的 getter 和 setter。
编辑我应该补充一点,我将创建的 FileInfo 对象插入到两种不同类型的哈希表中:一种从 TBucketList 下降,另一种是来自 Codegear 论坛的哈希映射实现。在内部,它们都是用户指针,所以情况就像另一个问题一样。
是否有任何其他可能使 Delphi 中的对象使用引用计数?
memory-management - 为什么纯函数式语言不使用引用计数?
在纯函数式语言中,数据是不可变的。使用引用计数,创建引用循环需要更改已创建的数据。似乎纯函数式语言可以使用引用计数而不必担心循环的可能性。是对的吗?如果是这样,他们为什么不呢?
我知道在许多情况下引用计数比 GC 慢,但至少它减少了暂停时间。在暂停时间不好的情况下,可以选择使用引用计数。