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

c++ - 缺少 shared_ref

虽然std::shared_ptr有很多工作,但我有点想念一个shared_ref实现。这是 的一种特殊化shared_ptr,它保证它永远不会包装 a nullptr(当然,在正确使用的情况下)。我有点想知道为什么它不在 C++11 标准中。实施过程中是否有市长问题?在我的头顶上,我想不出任何东西。

编辑:

我希望有一个类似于:

0 投票
3 回答
2593 浏览

java - Java中的智能指针和引用计数

我正在尝试用 Java 编写 DagNode 类,其中两个节点在逻辑上相等,如果它们作为引用相等。

C++(我来自 C++)中的想法是使用智能指针和引用计数:

  • 创建节点后,如果该节点已存在,我将在某个表中查找。如果是这样,我将返回一个指向旧指针的指针。否则,创建一个新节点。

  • 重载的 C++ 方法(如复制构造函数和析构函数)会进行 ref-counting,当节点的 ref-count 降至 0 时,该节点会从上述表中逐出。(C++ 也会释放内存。)

但是,似乎没有办法在 Java 中自动进行引用计数。我需要进行引用计数以知道何时从表中逐出节点(以便对其进行垃圾收集),并且我真的想避免在每个函数的开始和结束时 调用node->incRef()和。node->decRef()

我们如何在 Java 中实现这个 C++ 习语?

0 投票
2 回答
3321 浏览

string - string := const : 为什么本地和结果的实现不同?

在 Delphi 函数中,结果经常被实现为 var 参数(尽管有 QC 票,但不是超出参数)。

字符串常量基本上是具有负 refcounter 的变量,应该抑制自动内存 [de] 分配。http://docwiki.embarcadero.com/RADStudio/XE3/en/Internal_Data_Formats#Long_String_Types

它确实抑制了它:下面的代码不会泄漏。

但是改变操纵变量 - 它立即开始大量泄漏。

事实证明,它string := const是通过不同的调用实现的,具体取决于 LValue:

  1. 结果:AnsiString -> LStrAsg
  2. 结果:UnicodeString:-> UStrAsg
  3. 本地变量:UnicodeString:-> UStrLAsg
  4. 本地变量:AnsiString:-> LStrLAsg

虽然后两者按预期克隆指针,但前两者正在将字符串复制到新实例,就像我添加UniqueString对它们的调用一样。

为什么会有这种差异?

0 投票
1 回答
61 浏览

objective-c - ARC 迁移器在其他目标中返回错误

我正在尝试将旧项目转换为 ARC。我的项目依赖于 Cocos2D,它是一个第三方非 ARC 库。所有 Cocos2D 源文件都是单独目标的一部分,并被编译为静态库。

但是,ARC 迁移ARC semantic issue器在 Cocos2D 源文件中返回错误,即使它们不是我要转换的主要目标的一部分。

这可能是什么原因?那个源代码应该没关系,对吧?

0 投票
2 回答
4584 浏览

c++ - weak_ptr 如何知道共享资源已过期?

考虑以下代码:

考虑到引用的资源基本上已被另一个资源替换,如何weak_ptr知道它已过期?跟踪什么来确定旧的shared_ptr共享资源已被销毁并被的共享资源替换?此类方法的示例定义(如果相关)将不胜感激。weak_ptrlockweak_ptr

0 投票
1 回答
140 浏览

python - 访问列表是否会更改其引用计数?

我正在处理的原始问题在此处概述。我想问一个与原始问题相关的附加问题(关于 Python 引用计数)。

可以说我有以下脚本:

当我调用时list1任一列表中的引用计数list2或任何对象是否会发生变化?calculate(list1,list2)

澄清一下:我并不是说在调用之前和之后引用计数是否相同calculate(list1,list2)。我的意思是如果引用计数在执行期间的任何时候发生变化calculate(list1,list2)

0 投票
1 回答
1191 浏览

python - Python 禁用某些对象的引用计数

这个问题来源于这里

我有三个包含 python 对象(l1l2l3的大列表。这些列表是在程序启动时创建的,它们总共占用 16GB 的 RAM。该程序将专门用于 linux。

在创建这些列表或这些列表中的对象后,我不需要以任何方式或形式对其进行修改。它们必须保留在内存中,直到程序退出。

我在我的程序中使用 os.fork() 和 multiprocessing 模块来生成多个子进程(目前最多 20 个)。这些子流程中的每一个都需要能够读取三个列表(l1l2l3

我的程序在其他方面运行良好且速度非常快。但是我遇到了内存消耗问题。由于 Linux 上的写时复制方法,我希望每个子进程都可以使用这三个列表而无需将它们复制到内存中。但是,情况并非如此,因为在这些列表中的任何一个中引用任何对象都会增加相关的引用计数,因此会导致整个内存页面被复制。

所以我的问题是:

我可以禁用这些列表中所有对象l1l2引用计数吗?l3基本上使整个对象(包括元数据,如引用计数)只读,这样它在任何情况下都不会被修改(我认为,这将允许我利用写时复制)。

目前我担心我被迫转向另一种编程语言来完成这项任务,因为我目前不需要的“功能”(引用计数),但仍然强加给我并导致不必要的问题。

0 投票
3 回答
346 浏览

python - 为什么调用 locals() 会添加引用?

我不明白以下行为。

  • 如何locals()产生新的参考?
  • 为什么 gc.collect 不删除它?我没有分配locals()任何地方的结果。

X

输出是:

0 投票
1 回答
67 浏览

python - Strange behaviour of ref counter with ints being 0

I was fiddling with the ctypes module of python to better understand how the garbage collector works. Playing in the interpreter, I came through this strange situation :

Why does it seem that myInt is referenced 283 times by Python ? Have I missed something ?

Thanks for your insights.

0 投票
2 回答
156 浏览

python - python:函数*有时*维护对其模块的引用

如果我执行一个模块,并删除所有(我的)对该模块的引用,它的功能将继续按预期工作。这很正常。

但是,如果该 execfile'd 模块导入其他模块,并且我删除了对这些模块的所有引用,则这些模块中定义的函数开始将它们的所有全局值视为无。当然,这会导致事情以一种非常令人惊讶的方式失败(例如,字符串常量上的 TypeError NoneType)。

我很惊讶口译员在这里做了一个特殊情况;execfile似乎没有足够的特殊性来导致函数在模块引用中表现不同。

我的问题:对于由 execfile'd 模块导入的模块,是否有任何干净的方法可以使 execfile 函数行为递归(或在有限上下文中全局)?


给好奇的人:

该应用程序是在 buildbot 下可靠的配置重新加载。buildbot 配置是可执行的 python,无论好坏。如果可执行配置是单个文件,则一切正常。__import__如果将该配置拆分为模块,则由于and的语义,来自顶级文件的任何导入都会卡在原始版本中sys.modules。我的策略是在配置前后保持 sys.modules 的内容不变,这样每次重新配置看起来就像一个初始配置。除了上述函数全局参考问题外,这几乎可以工作。


这是该问题的可重复演示: