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なった場合、参照を呼び出そうとすると例外が発生します…</ p> nilclosed?nil

于 2012-10-31T00:20:35.963 に答える