我不确定我是否理解范围 - 一个超出范围的变量(我正在使用Ruby)存在于某个地方的存储器中还是停止存在(我知道你无法访问它)。 说超出范围的变量不再存在会不准确吗?

也许这是一个哲学问题。

有帮助吗?

解决方案

如果您使用的是托管语言,那么您不会分配和取消分配内存,因此就您而言,它不再存在。

技术上确实如此,但GC往往不具有确定性,所以在技术上很难说它什么时候会消失。

其他提示

变量与其保存的值不同。

变量本身在超出范围时不再存在。变量所持有的可能代表一个对象,并且该对象可能会继续存在于变量的生命周期之外。垃圾收集器稍后回收该对象。

当它超出范围时,它仍然存在(在某种意义上它有一些内存分配给它)一段时间,直到垃圾收集清理它。但正如你暗示的那样,它失去了它的名字并且无法到达。

当变量超出范围时,周围的任何人都会听到它尖叫吗?

这不是一个红宝石问题,而是关于垃圾收集的一般问题。在垃圾收集语言(如Ruby或C#)中,当变量超出范围时,它会以某种方式标记,表明它已不再使用。当发生这种情况时,你再也无法得到它并且它绕着它的拇指摆动 - 但它仍然有分配给它的记忆。

在某些时候,垃圾收集器将唤醒并查找标记为未使用的变量。它将处置它们,此时它们根本就不再存在。

它可能比这更复杂,取决于垃圾收集器的工作方式,但它足够接近:)

它存在一点点,直到垃圾收集器处理它(如果可以的话)。

Rob Kennedy对此做出了适当的回答,但我想我会补充一点细节。

要认识到的重要一点是变量与它所代表的值之间的差异。

这是一个例子(在C#中,因为我不知道Ruby):

object c = null;
if (1 == 1) // Just to get a different scope
{
    var newObj = new SomeClass();
    newObj.SomeProperty = true;
    c = newObj;
}

在上面的代码中,newObj超出了if语句末尾的范围,因此“不存在”,但它所引用的值仍然存活且很好,由c引用。一旦对该对象的所有引用都消失了,那么垃圾收集器将负责清理它。

如果你在谈论文件对象,它不仅仅是一个哲学问题。如果我没记错的话,文件在超出范围时不会自动关闭 - 只有在你要求它们关闭时才会关闭,或者你使用 File.open do | file | 样式块,或者如果他们收集垃圾如果其他代码(或单元测试)尝试读取该文件的内容并且尚未刷新,则可能会出现问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top