2009-03-02 4 views
4

私は範囲を理解していません - 範囲外の変数(私はRubyを使用しています)はどこかのメモリに存在するか、既存のものを止めますか(私はあなたがそれにアクセスできないと知っています)。 範囲外の変数がもう存在しないと言うのは間違いでしょうか?変数が有効範​​囲外になると、変数が存在しないことを意味しますか?

多分これは哲学的な質問です。

答えて

5

管理された言語を使用している場合は、メモリが割り当てられていなくても、メモリが割り当てられていなくても、メモリが割り当てられていなくても割り当ては解除されます。

技術的にはそれはありますが、GCは決定的ではない傾向がありますので、技術的には実際には消えてしまうのは難しいです。

+2

シュレディンガーの猫と同じように存在します。 –

+0

lol ...今私はすべての私の一時変数catを呼び出すつもりです –

+0

これは 'File'オブジェクトにとって重要です。 –

1

ガベージコレクタがそれを廃棄するまで(少しでも)存在します。

2

スコープ外になると、ガベージコレクションがそれをクリーンアップするまで、しばらくの間(まだメモリが割り当てられているという意味で)存在します。しかし、あなたが暗示しているように、それはそれが失われていて、到達できません。

2

変数がスコープから外れると、周りの人が叫んで聞こえますか?

ガベージコレクションに関する一般的な質問と同様、これはルビーの質問ではありません。 RubyやC#のようなガベージコレクトされた言語では、変数がスコープから外れると、それはもはや使用されていないという形でマークされます。これが起こると、もうそれ以上に乗ることはできず、親指をつまんでいるところに座っていますが、まだメモリが割り当てられています。

ある時点で、ガベージコレクタが起動し、使用されていないとマークされた変数が検索されます。それを処分し、その時点で彼らはもはや記憶に残っていません。

これは、ガベージコレクタがどのように機能するかに応じて、これよりも複雑になることができますが、それは十分に近いです:)

3

変数は、それが保持している値と同じではありません。

変数がスコープ外になると、変数自体は存在しなくなります。 は、保持されている変数がオブジェクトを表す可能性があり、そのオブジェクトは変数の存続期間を超えて存在し続ける可能性があります。ガベージコレクタは後でオブジェクトを再要求します。

1

Rob Kennedyが適切に答えてくれましたが、少し詳しく説明しました。

重要なことは、変数とそれが表す値の違いです。 (私はルビーを知らないので、C#で)ここで

は例です:上記のコードで

object c = null; 
if (1 == 1) // Just to get a different scope 
{ 
    var newObj = new SomeClass(); 
    newObj.SomeProperty = true; 
    c = newObj; 
} 

、NEWOBJは、if文の終わりに、そのようにスコープから外れません」存在していますが、それが参照していた価値はまだ生きていて、cによって参照されています。オブジェクトへのすべての参照がなくなると、ガベージコレクタはそのオブジェクトをクリーンアップします。

0

ファイルオブジェクトについて話している場合、それは哲学的な問題以上のものになります。正しく呼び出すと、ファイルが範囲外になったときに自動的に閉じることはありません。クローズするか、File.open do |file|スタイルブロックを使用した場合、またはガベージコレクションが行われた場合にのみ閉じます。これは、他のコード(または単体テスト)がそのファイルの内容を読み込もうとしていて、まだフラッシュされていない場合に問題となります。

関連する問題