2012-10-31 34 views
0

對象在關閉後是否仍在內存中?如果是這樣,那是因爲垃圾收集還沒有被踢進去嗎?它看起來只是被標記爲已刪除,而不是實際上從內存中消失。這是在IRB中產生的,如果這可能會影響它的話。爲什麼在Ruby中關閉文件對象後仍然存在?

在此先感謝!

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

這並不是什麼特別的文件。這是關於變量的一般事情。如果在某個時候,「f」突然開始失去其指涉,那就會是一團糟。 – sawa

回答

3

對象仍然存在於內存中關閉該文件之後。你的變量f持有對它的引用,所以它不能消失。就像任何其他對象一樣,您仍然可以訪問它,直到所有對它的引用都消失爲止。

1

f是對類File的實例的引用。只要引用存在,實例(對象)就不會被垃圾收集。現在,這個特定的對象碰巧有一個叫做close的方法,該方法導致文件被關閉,但是對參考f沒有任何作用,這將需要被設置爲指向垃圾收集的其他東西。

因此,要擺脫對象像其他任何,你必須指定f其他 - File或任何其他類的實例沒有特殊情況下爲您零此類引用。 (實際上這將是有問題的,如果任意的方法可以默默導致您的引用而成爲nil,然後導致異常當您嘗試使用它。)

編輯:還要考慮的事實,你可以檢查文件通過致電f.closed?關閉。如果f在關閉時(或關閉後的某個時間)變爲nil,試圖在nil參考上嘗試呼叫closed?將導致例外...

+0

我想我認爲File是不同的,因爲有一個很接近的方法。你碰巧知道密切方法實際上做了什麼?這只是一個標誌,阻止任何進一步的代碼操作嗎? – redgem

+0

好吧,顯然'close'方法關閉了文件。也就是說,內部的'File'對象基本上是平臺文件描述符的一個包裝。但僅僅因爲一個方法被稱爲關閉並不是特別的,它可以以某種方式在不知道它的情況下將引用設置爲「nil」......例如,如果你要編寫自己的類MyFile,你會實施'close'方法以便將參考設置爲'nil'嗎?你的班級的使用者會如何知道你是做到了,或者你只是以這種特定的方式做到了? 「close」只是一個字。 – Arkku

相關問題