0

对象关闭后是否还在内存中?如果是这样,那是因为垃圾收集还没有开始吗?看起来它只是被标记为已删除,而不是实际上已从内存中消失。这是在 IRB 中制作的,如果这可能会影响它的话。

提前致谢!

1.9.3p125 :001 > f = File.open("myfile.txt", "r")
=> #<File:myfile.txt>     

1.9.3p125 :002 > f
=> #<File:myfile.txt>

1.9.3p125 :002 > f.size
 => 122 

1.9.3p125 :003 > f.close
 => nil 

1.9.3p125 :004 > f
 => #<File:myfile.txt (closed)> 
4

2 回答 2

3

关闭文件后,该对象仍存在于内存中。你的变量f持有对它的引用,所以它还不能消失。就像任何其他对象一样,您仍然可以访问它,直到所有对它的引用都消失了。

于 2012-10-31T00:10:22.633 回答
1

f是对类实例的引用File。只要引用存在,实例(对象)就不会被垃圾收集。现在,这个特定的对象碰巧有一个方法被调用close,它导致文件被关闭,但这对引用没有任何作用f,需要将其设置为指向其他东西才能启动垃圾收集。

因此,要摆脱该对象,就像任何其他对象一样,您必须将其他内容分配给f- 实例或任何其他类没有特殊情况可以File为您将此类引用归零。(确实,如果任意方法可以默默地导致您的引用变为nil,然后在您尝试使用它时导致异常,那将是有问题的。)

编辑:还要考虑这样一个事实,即您可以通过调用来检查文件是否已关闭f.closed?。如果f在关闭时(或关闭后的某个时间nil)变为,尝试调用引用会导致异常……</p> closed?nil

于 2012-10-31T00:20:35.963 回答