对象关闭后是否仍在内存中?如果是这样,那是因为垃圾收集尚未开始吗?看起来它只是被标记为已删除而不是实际从内存中消失。这是在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)>
答案 0 :(得分:3)
关闭文件后,对象仍然存在于内存中。你的变量f
持有对它的引用,所以它还不能消失。就像任何其他对象一样,您仍然可以访问它,直到对它的所有引用消失为止。
答案 1 :(得分:1)
f
是对类File
的实例的引用。只要引用存在,实例(对象)就不会收集垃圾。现在,这个特定的对象碰巧有一个名为close
的方法,它导致文件被关闭,但这对引用f
没有任何作用,需要将其设置为指向垃圾的其他内容收集开始。
因此,为了摆脱对象,与任何其他一样,你必须为f
指定其他内容 - File
的实例没有特殊情况或任何其他类为您提供此类引用。 (事实上,如果任意方法可以默默地使您的引用变为nil
,然后在尝试使用它时导致异常,那么这将是有问题的。)
修改:还要考虑一下,您可以通过调用f.closed?
来检查文件是否已关闭。如果f
在关闭时(或关闭后的某个时间)变为nil
,则尝试在closed?
引用上调用nil
会导致异常......