问题标签 [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 投票
10 回答
20675 浏览

c# - 为什么 C# 中没有引用计数 + 垃圾回收?

我来自 C++ 背景,我已经使用 C# 工作了大约一年。像许多其他人一样,我对为什么确定性资源管理没有内置在语言中感到困惑。我们有 dispose 模式,而不是确定性析构函数。人们开始怀疑通过他们的代码传播 IDisposable 癌症是否值得付出努力。

在我偏向 C++ 的大脑中,使用带有确定性析构函数的引用计数智能指针似乎是垃圾收集器的一大进步,垃圾收集器需要你实现 IDisposable 并调用 dispose 来清理你的非内存资源。诚然,我不是很聪明......所以我问这个纯粹是为了更好地理解为什么事情会这样。

如果 C# 被修改为:

对象是引用计数的。当一个对象的引用计数变为零时,会在该对象上确定性地调用资源清理方法,然后将该对象标记为进行垃圾回收。垃圾收集发生在未来某个不确定的时间,此时内存被回收。在这种情况下,您不必实现 IDisposable 或记得调用 Dispose。如果您有非内存资源要释放,您只需实现资源清理功能。

  • 为什么这是个坏主意?
  • 这会破坏垃圾收集器的目的吗?
  • 实施这样的事情是否可行?

编辑:从到目前为止的评论来看,这是一个坏主意,因为

  1. 没有引用计数的 GC 更快
  2. 处理对象图中的循环问题

我认为第一个是有效的,但第二个很容易使用弱引用来处理。

速度优化是否超过了您的缺点:

  1. 可能无法及时释放非内存资源
  2. 可能过早释放非内存资源

如果您的资源清理机制是确定性的并且内置于语言中,那么您可以消除这些可能性。

0 投票
3 回答
2098 浏览

c++ - Microsoft 对象,Release() 函数返回值?

我很好奇,因为我在 MSDN 上找不到这个。我发现该Release()函数存在于各种 COM 对象中,我显然应该使用这些对象来删除指针。但我不确定它到底返回了什么?我曾经认为它会返回仍然存在的对剩余对象的引用数,因此类似于:

显然会释放对该指针的所有引用吗?

还是我什么都没看到?

*注意我是从IDirect3DTexture9::Release()函数的概念说的

0 投票
8 回答
20640 浏览

php - 如何修复 PHP 中的内存泄漏

我的 PHP 应用程序有一个可以导入记录的导入脚本。

目前,它正在从 CSV 文件导入。它正在读取 CSV 文件的每一行,使用 fgetcsv 一次一行,并且对于每一行,它对该记录进行大量处理,包括数据库查询,然后转到下一行。它不应该需要不断积累更多的内存。

在导入大约 2500 条记录后,PHP 死了,说它已超出其内存限制(132 MB 左右)。

CSV 文件本身只有几兆 - 发生的其他处理会进行大量字符串比较、差异等。我有大量代码在上面操作,很难想出一个“最小的复制”样本'。

有哪些好方法可以找到并解决此类问题?

发现问题原因

我有一个调试类,它在运行时记录我所有的数据库查询。因此,那些大约 30KB 长的 SQL 字符串保留在内存中。我意识到这不适合设计为长时间运行的脚本。

可能还有其他内存泄漏来源,但我很确定这是我的问题的原因。

0 投票
6 回答
490 浏览

c++ - 检测何时将对象传递给 C++ 中的新线程?

我有一个对象,我想跟踪引用它的线程数。通常,当调用对象上的任何方法时,我可以检查线程本地布尔值以确定当前线程的计数是否已更新。但是,如果用户说使用 boost::bind 将我的对象绑定到 boost::function 并使用它来启动 boost::thread,这对我没有帮助。新线程将引用我的对象,并且在调用它的任何方法之前可能会无限期地持有它,从而导致过时的计数。我可以围绕 boost::thread 编写自己的包装器来处理这个问题,但是如果用户 boost::bind 的对象包含我的对象(我不能根据成员类型的存在进行专门化——至少我不知道有什么方法可以做到这一点)并使用它来启动 boost::thread。

有没有办法做到这一点?我能想到的唯一方法需要用户做太多工作——我提供了一个围绕 boost::thread 的包装器,它在传入的对象上调用一个特殊的钩子方法,前提是它存在,并且用户将这个特殊的钩子方法添加到任何类包含我的对象。

编辑:为了这个问题,我们可以假设我控制了制作新线程的方法。所以我可以包装 boost::thread 例如并期望用户会使用我的包装版本,而不必担心用户同时使用 pthread 等。

Edit2:也可以假设我有一些可用的线程本地存储方法,通过__threadboost::thread_specific_ptr。它不在当前标准中,但希望很快就会出现。

0 投票
11 回答
9657 浏览

reference-counting - 循环引用有哪些解决方案?

使用引用计数时,有哪些可能的解决方案/技术来处理循环引用?

最著名的解决方案是使用弱引用,但是许多关于该主题的文章暗示还有其他方法,但不断重复弱引用示例。这让我想知道,这些其他方法是什么?

  • 我不是在问引用计数的替代方法是什么,而是在使用引用计数时循环引用的解决方案是什么。

  • 这个问题不是关于任何特定问题/实现/语言,而是一个一般性问题。

0 投票
1 回答
194 浏览

c# - 如何确定在 C# 中的对象图中是否可以访问对象?

我有一个非常复杂的对象图,G其中包含一个对象o1。将使用 NHibernate 写入数据库。但是,如果数据库中已经存在(我们称之为)的持久条目,我将替换为. 因此,数据库中不应该有多余的条目。现在我让 NHibernate 完成它的工作,然后我查看数据库。现在我遇到了我试图避免的情况。数据库中有原始对象加上的条目。到目前为止,我唯一的解释是可以通过另一条路线到达GGo1o1_po1o1_po1_po1o1G所以hibernate把它放到数据库中。有没有办法可以确定是否是这种情况,即我可以询问垃圾收集器有多少对o1. 或者用图形语言说:有多少条输入边o1

0 投票
2 回答
3931 浏览

.net - .NET 中的弱引用实现

我理解并欣赏System.WeakReference类在 .NET 框架中的用处,但对实现细节感到好奇。

WeakReference 如何在 .NET 中实现?MSDN 详细讨论了 WeakReference 的用法,但我所看到的关于它如何在幕后工作的细节很少。

CLR 如何跟踪引用并知道在收集 Target 时将内部句柄清空,而不阻止 GC?它是否需要在 CLR 本身中进行特殊处理?

我主要关心的是使用 Wea​​kReferences(特别是如果使用其中的许多)是否存在与使用标准对象引用不同的性能影响。

0 投票
4 回答
1823 浏览

c++ - C++ 在 std::list<> 中存储大数据 ..我应该使用引用计数吗?

人们通常如何管理复制大型对象列表?

这是我的情况:

目前我有这个:

我把它存储在一个

Image.size() 非常大(每个约为 3-5 MB)。

我正在传递(复制)列表。

我对 std::vector 将按值复制每个元素的理解是否正确?如果是这样,由于过度复制,性能可能会有点糟糕?

我可以做些什么来减少复制?我应该改为存储

在哪里

?

处理此类问题的优雅方式是什么?

0 投票
10 回答
8965 浏览

c++ - C++:多线程和引用计数

目前,我使用以下方法获得了一些引用计数类:

我还有一个处理引用计数的智能指针类,尽管它没有统一使用(例如,在一个或两个性能关键代码中,我最小化了 IncRef 和 DecRef 调用的数量)。

对于类本身的一般用途,我计划使用读取器/写入器锁定系统,但是我真的不想为每个单独的 IncRef 和 DecRef 调用获取写入器锁。

我还只是想到了在 IncRef 调用之前指针可能无效的情况,请考虑:

所以我想我需要完全改变引用计数模型,我在设计中返回后添加引用的原因是为了支持以下内容:

而不必:

在多线程环境中,C++ 中是否有一种快速引用计数的干净方法?

0 投票
6 回答
5031 浏览

multithreading - LWARX 和 STWCX 的 x86 等效项

我正在寻找 LWARX 和 STWCX 的等价物(在 PowerPC 处理器上找到)或在 x86 平台上实现类似功能的方法。此外,哪里是了解此类事情的最佳地点(即,用于锁定/无等待编程的好文章/网站/论坛)。


编辑
我想我可能需要提供更多细节,因为假设我只是在寻找 CAS(比较和交换)操作。我想要做的是实现一个无锁引用计数系统,它带有可以被多个线程访问和更改的智能指针。我基本上需要一种在 x86 处理器上实现以下功能的方法。

我真的需要一些能够相当准确地模仿 LWARX 和 STWCX 的东西来实现这一点(我想不出一种方法来使用 CompareExchange、交换或添加我迄今为止为 x86 找到的函数)。

谢谢