2011-02-01 20 views
2

参照変数をインスタンス変数で切り離した後、GCの注意事項を不定期に読みましたが、deleteメソッドの2行目は愚かで、不要で、徹底していますか?Rubyでクラスインスタンスを削除しますか?

class MyClass 
    # new instances added to @@instances 
    ... 
    def delete 
    @@instances.delete(self) 
    self.instance_variables.each{|v| self.instance_variable_set(v,nil)} 
    end 

end 
+1

2行目はコメントです。コメントは常に愚かで不要です。 –

+0

私はそれをより明確にするために編集します。ようこそ! –

+1

@Radek S:コメントはいつも愚かですか?最近、子供たちが言うように、あなたはまっすぐにトリピンします。 – Chuck

答えて

0

不要です。 GCを実際にトリガーしたい場合は、GC.startまたはObjectSpace.garbage_collectを使用してください。

そしてそれは再び、多くの場合、十分にお勧めすることができないので:

http://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

+0

GCにマークするインスタンスをセットアップしたという良いテストはありますか? – domino

+0

参照がない場合、または範囲外の場合は、GC用にマークされます。スコープから外れているかどうかは 'defined? my_instance'を返し、 'nil'を返すと、それが収集されます。スコープから外れることのない参照がある場合は、単に 'my_instance = nil'を実行してください。 – dontangg

1

@@instances構造から除去されているインスタンスのスコープ内で実行delete方法、従ってそれをすることはできませんガベージコレクション。何かがそのメソッドを実行するようにトリガしました。何かが現在そのメソッドへの参照を保持しているので、メソッドが返ってからオブジェクトの参照がクリアされるまでガベージコレクションできません。

つまり、2行目は完全に不要です。たとえインスタンス変数の1つがオブジェクト自体を指していたとしても、GCはそれを理解するのに十分なほど巧妙です(むしろ、reference counting collectorではないので、無視します)。

メモリを手動で管理しようとしないでください。これは効果がありません。これらのインスタンス変数内のオブジェクトへの参照をクリアするかどうかにかかわらず、GCは解放される時点を決定します。 deleteが実行された後、コード例のアイデアを正しく解釈すると、ホストオブジェクトへのすべての参照がクリアされます。この場合、インスタンス変数もクリアされても問題はありません。オブジェクトはガベージコレクションの対象になりますどちらにしても。オブジェクトに到達できなくなったときにオブジェクトがGCされますが、他の到達不能なオブジェクトに参照があるかどうかは関係ありません。

関連する問題