问题标签 [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.

0 投票
7 回答
17150 浏览

c++ - 如何在 C++ 中实现线程安全引用计数

如何使用 C++ 编程语言在 X86 CPU 上实现高效且线程安全的引用计数系统?

我总是遇到关键操作不是原子的问题,可用的 X86 互锁操作不足以实现引用计数系统。

以下文章涵盖了该主题,但需要特殊的 CPU 指令:

http://www.ddj.com/architect/184401888

0 投票
3 回答
2587 浏览

delphi - 为什么不收集 TInterfacedObject 的后代垃圾?

我有一个基于 TInterfacedObject 的类。我将它添加到 TTreeNode 的 Data 属性中。

我创建了这个对象的许多实例并假设因为它们是引用计数的,所以我不需要释放它们。那会很方便。

但是,当检查这个时,我打开了 ReportMemoryLeaksOnShutdown 并发现它们毕竟没有被释放。

这些对象是在放置在主窗体上的框架中创建的。在主窗体的 FormClose 中,我清除树节点,以便释放每个对象。

发生了什么?

感谢您的帮助!

0 投票
4 回答
2823 浏览

delphi - 如何在 Delphi 中实现引用计数对象

我有一个类似结构的图。我不确切知道何时以传统的 Delphi 方式销毁对象,相反我想实现类似引用计数对象之类的东西。我知道我可以使用 object.GetReference 和 object.Release 之类的东西来代替 Free,并使用私有变量进行引用计数,但有没有更好的方法?

谢谢

0 投票
9 回答
7236 浏览

c++ - 在 C++ 中实现智能指针的最佳方法是什么?

我一直在评估各种智能指针实现(哇,那里有很多),在我看来,它们中的大多数可以分为两大类:

1) 此类别对引用的对象使用继承,以便它们具有引用计数,并且通常实现 up() 和 down()(或它们的等价物)。IE,要使用智能指针,您指向的对象必须从 ref 实现提供的某个类继承。

2) 此类别使用辅助对象来保存引用计数。例如,智能指针不是直接指向一个对象,而是实际上指向这个元数据对象……谁有引用计数和 up() 和 down() 实现(并且谁通常提供指针指向的机制获取指向的实际对象,以便智能指针可以正确实现运算符->())。

现在, 1 有一个缺点,它强制您希望引用 count 的所有对象都从一个共同的祖先继承,这意味着您不能使用它来引用您无法控制源代码的 count 对象到。

2 的问题是由于计数存储在另一个对象中,如果您曾经遇到将指向现有引用计数对象的指针转换为引用的情况,您可能有一个错误(IE,因为计数不在实际对象,新引用无法获取计数...引用到引用复制构造或赋值很好,因为它们可以共享计数对象,但是如果您必须从指针转换,您重新完全冲洗)...

现在,据我了解, boost::shared_pointer 使用机制 2,或类似的东西......也就是说,我无法完全决定哪个更糟!我只在生产代码中使用过机制 1……有人对这两种风格都有经验吗?或者也许还有另一种比这两种方法更好的方法?

0 投票
1 回答
1093 浏览

c++ - Swig 和引用计数的 C++ 类

我的许多 C++ 对象通过 AddRef 和 FreeRef 方法实现了引用计数。如果 FreeRef 将引用计数减少到 0,则对象将删除其自身。

所有返回引用计数对象的方法都不会增加引用。这使得它变得简单,因为智能指针可以简单地在接收到指针时增加计数,并在它们不再引用它时减少计数。例如:

我在想也许我可以告诉 SWIG 只在内部使用我现有的智能指针来处理这些可能有效的对象,但是我也不知道该怎么做:(

0 投票
5 回答
8393 浏览

c++ - 引用计数指针的 STL 类?

这应该是微不足道的,但我似乎找不到它(除非不存在这样的类!)

智能指针的 STL 类(或类集)是什么?

更新

感谢您的回复,
我必须说我很惊讶没有标准实施。

我最终使用了这个: http: //archive.gamedev.net/reference/articles/article1060.asp

0 投票
5 回答
5502 浏览

c++ - 为什么 VC++ 字符串不被引用计数?

STL 标准不要求从 std::string 被引用。但事实上,大多数 C++ 实现都提供了引用计数、写入时复制的字符串,允许您将字符串作为原始类型按值传递。此外,这些实现(至少 g++)使用原子操作使这些字符串无锁且线程安全。

简单的测试显示了写时复制语义:

在使用非常量成员之后,仅打印两个地址。

我使用 HP、GCC 和 Intel 编译器测试了这段代码,得到了类似的结果——字符串作为写时复制容器工作。

另一方面,VC++ 2005 清楚地表明每个字符串都是完全复制的。

为什么?

我知道 VC++6.0 中有一个错误,它具有非线程安全的引用计数实现,导致随机程序崩溃。这是原因吗?他们只是害怕再使用引用计数,即使这是常见的做法?他们宁愿完全不使用引用计数来解决问题?

谢谢

0 投票
12 回答
8086 浏览

c++ - 使用 shared_ptr 时如何检测循环

shared_ptr 是 Boost 库中的引用计数智能指针。

引用计数的问题是它不能处理循环。我想知道如何在 C++ 中解决这个问题。

请不要提出诸如“不要循环”或“使用弱点”之类的建议。

编辑

我不喜欢只使用 weak_ptr 的建议,因为显然如果你知道你会创建一个循环,那么你就不会有问题。如果您在运行时生成 shared_ptrs,您也无法知道在编译时会有一个循环。

因此,请自行删除其中使用 weak_ptr 的答案,因为我特别要求不要有那种答案......

0 投票
7 回答
6346 浏览

delphi - 对象的引用计数

在我的代码中,我使用了一个在不同位置创建的小型数据存储类。为了避免内存泄漏和简化事情,我想使用引用计数,所以我做了

并删除了我对 TFileInfo.Free 的所有手动调用。不幸的是,Delphi 报告了很多内存泄漏。搜索 SO 我发现以下问题解释了为什么这不起作用:

为什么不收集 TInterfacedObject 的后代垃圾?

那里提供了一种解决方法,但它需要我(至少如果我做对了)编写自定义接口 IFileInfo 并为其提供很多我想避免的 getter 和 setter。

编辑我应该补充一点,我将创建的 FileInfo 对象插入到两种不同类型的哈希表中:一种从 TBucketList 下降,另一种是来自 Codegear 论坛的哈希映射实现。在内部,它们都是用户指针,所以情况就像另一个问题一样。

是否有任何其他可能使 Delphi 中的对象使用引用计数?

0 投票
6 回答
6441 浏览

memory-management - 为什么纯函数式语言不使用引用计数?

在纯函数式语言中,数据是不可变的。使用引用计数,创建引用循环需要更改已创建的数据。似乎纯函数式语言可以使用引用计数而不必担心循环的可能性。是对的吗?如果是这样,他们为什么不呢?

我知道在许多情况下引用计数比 GC 慢,但至少它减少了暂停时间。在暂停时间不好的情况下,可以选择使用引用计数。