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

java - Java中的垃圾收集

在我正在修改的幻灯片上,它说以下内容:

可以通过维护对每个对象的引用数的计数,或通过跟踪从根开始的引用链来识别活动对象。

引用计数很昂贵——每次引用发生变化时都需要采取行动,而且它不会发现循环结构,但它可以逐步回收空间。

跟踪涉及仅在需要回收空间时识别活动对象——将成本从一般访问转移到 GC 运行时间,通常仅在内存不足时。

我理解为什么引用计数很昂贵的原理,但不明白什么是“不能发现循环结构,但它可以逐步回收空间”。方法。任何人都可以帮我一点吗?

谢谢

0 投票
2 回答
181 浏览

debugging - 即使仍然有引用,我可以销毁类实例吗?

出于调试原因,我想销毁仍然作为引用的类实例。那可能吗?它不必优雅或稳定,因为这永远不会出现在生产代码中。

澄清:

那可能吗?一种方法是调用IUnknown::Release手动减少引用计数,但是我现在必须多久调用一次呢?

0 投票
2 回答
13053 浏览

delphi - 动态数组超出范围时会自动释放吗?

在这个例子中

数组被破坏还是内存泄漏?

0 投票
2 回答
293 浏览

objective-c - Cocoa 中的引用计数

我假设根据我正在阅读的“Cocoa 设计模式”书,retain 函数是使用这样的东西实现的:

如示例所示,每个引用对象都具有相同的 self 成员。这是怎么发生的?也许我不明白 self 的含义 - 我虽然它就像 C++ 中的“this”。

如果我只使用赋值运算符(A = B)它是否复制指针(自我),就是这样?我虽然它会使用“copywithzone”,但它的亲戚和“自我”成员不会相等。此外,我认为 copywithzone 就像 c++ 中的复制构造函数。

我想我在两个世界之间感到困惑。

0 投票
1 回答
177 浏览

.net - 共享使用计数器的同步原语?

是否有 Windows(或 .NET)同步原语:

  • 可以在同一台PC上的多个进程之间共享;
  • 表示当前有多少线程依赖于共享资源的计数器;
  • 当进程异常终止时由操作系统自动递减;和
  • 可以由另一个进程等待(并在计数降至零时发出信号)?

我想跨多个进程共享一个资源,然后在最后一个进程退出(无论是正常还是异常)或声明它已完成该资源时关闭该资源。启动时必须进行一些握手,但这是可行的;有趣的部分是等待进程退出。

据我所知,命名信号量(具有高初始计数)可以满足除最后一个要求之外的所有要求。但是信号量倒计时而不是倒计时,而且我看不到等待信号量达到最大计数的方法。

如果不存在这方面的原语,是否有一个 .NET 库可以创建类似的东西,或者有关如何构建的信息?

(这是针对我如何才能等到 Windows 进程及其子进程全部退出?的可能实现。但是,尽管这个问题有许多可能的方法,但在这里我特别想探讨同步对象是否能胜任任务。它们是我想到的第一种方法,但我希望在这里了解它们是否真的会为此工作。)

0 投票
2 回答
2875 浏览

c++ - std::string 的引用计数

我正在查看basic_string(与 g++ 4.2.1 捆绑在一起的)的代码。复制构造函数使用一个grab()函数来“抓取”一个字符串的副本(增加它的引用计数):

仅当两个字符串的分配器相同时才会增加引用计数 - 有意义。但是,复制构造函数是:

传递给的第一个分配器_M_grab()是第二个的副本。为什么?operator==()for可能返回 false的唯一方法allocator是用户使用自定义分配器。但是,即使这是真的,您也会认为复制的分配器将与其原始分配器进行比较,对吗?所以:

  1. 为什么要比较分配器?
  2. 为什么要复制构建分配器并将副本与原始文件进行比较?
  3. 将副本与其原件进行比较会返回 false 的用例是什么?

更新

是的,_M_grab()用在另一个地方:分配。在这种情况下,传递给的分配器_M_grab() 不同的。美好的。但是似乎仍然没有理由同时复制构造然后比较构造函数中的分配器string

0 投票
1 回答
529 浏览

c++ - 引用计数对象和多个分配器

这是一个设计问题,假设 C++ 和引用计数对象层次结构。我的代码库中的许多类都派生自一个公共基类 (ObjectBase),它实现了 retain() 和 release() 方法来增加和减少对象实例的引用计数。

可以使用许多用户可定义的内存分配器在堆栈或堆上创建对象的每个实例。如果retainCount 达到0,为了让对象实例在release() 方法中自杀(删除this),实例必须知道它是用哪个分配器构造的。

目前,我正在使用任意分配器为对象实例分配内存,然后调用placement new 来构造对象实例,并在对象上调用 setAllocator() 方法来设置创建它的分配器。如果对象已经在栈上构建,分配器被设置为 NULL 并且 release() 不会调用 delete。这个过程非常多余,并且可能容易出错(内存泄漏,如果我忘记调用 setAllocator 等......)理想情况下,我希望将其设为这样的一步过程:

但这使得支持任意数量的构造函数参数变得非常困难。

我只是在寻找有关如何解决此问题的想法。我真的很喜欢能够引用计数对象而不必依赖智能指针的想法,尤其是因为大多数类都派生自一个公共基础,无论如何。

谢谢你的帮助。

弗洛里安

0 投票
1 回答
880 浏览

objective-c - Mac OS 中的垃圾收集和引用计数有什么区别

Mac OS X 中的垃圾收集和引用计数有什么区别。

谢谢并恭祝安康。马哈德万小号

0 投票
2 回答
11950 浏览

c++ - 简单的引用计数:智能指针

我想使用智能指针实现一个简单的引用计数。该变量pointer表示指向存储对象的指针,reference_count表示对象副本的总数。

  • 如果我们使用 NULL 初始化一个对象:reference_count = -1 else reference_count = 1
  • 复制 ctor 和 operator = 增加 reference_count
  • 析构函数递减reference_count,如果没有其他对指向对象的引用,则执行其删除。

这是我的代码:

这是我的测试代码,类示例存储 2D 点和两个指向任何其他 2D 点的指针。

二维点列表:

测试代码:

这种解决方案的优点或缺点在哪里?大量数据的运行速度如何,转换,继承可能出现的问题等。感谢您的帮助。

我对这个例子还有一个问题:哪种类型的智能指针(共享的,作用域的)最适合这种数据结构:

};

谢谢你的帮助...

0 投票
3 回答
919 浏览

c++ - 智能指针,或“更好”的析构函数

哪种类型的智能指针(共享,作用域)最适合这种数据结构......

结构一:

};

结构二:

我想使用向量存储 Edges 和 PointTopo:

但是析构函数存在问题,所以我想知道是否使用引用计数。

点 p1、p2 将存储在两个列表 tl1、tl2 中。tl2 的析构函数导致异常,点 p1 和 p2 已使用 tl1 析构函数删除。

这个例子不是合成的。想象一下,nl2 代表 nl1 的子集,例如 nl1 的凸包......

我认为,如果没有引用计数就无法解决这个问题......所以我尝试使用一些智能指针......

非常感谢您的帮助...