2009-03-02 6 views

Antwort

5

Wenn Sie verwaltete Sprache verwenden, dann reservieren Sie keinen Speicher und weisen ihn nicht zu, so dass er nicht mehr existiert.

Technisch ist es aber GCs neigen nicht dazu, deterministisch zu sein, also technisch ist es schwer zu sagen, wann es tatsächlich verschwindet.

+2

Es existiert in der gleichen Weise Schrödingers Katze. –

+0

lol ... jetzt werde ich alle meine temporären Variablen aufrufen cat –

+0

Es ist wichtig für 'File' Objekte. –

1

Es existiert für ein kleines bisschen, bis der Müllsammler es entsorgt (wenn es kann).

2

Wenn es den Gültigkeitsbereich verlässt, existiert es noch (in dem Sinne, dass ihm etwas Speicher zugewiesen ist) für einige Zeit, bis die Müllsammlung es aufräumt. Aber wie du andeutest, hat es seinen Namen verloren und ist unerreichbar.

2

Wenn eine Variable aus dem Rahmen fällt, ist jemand um ihn schreien zu hören?

Dies ist keine Ruby Frage so sehr wie eine allgemeine Frage über Garbage Collection. In einer Garbage-Collection-Sprache wie Ruby oder C#, wenn eine Variable außerhalb des Gültigkeitsbereichs liegt, wird sie in einer Weise markiert, die besagt, dass sie nicht mehr verwendet wird. Wenn das passiert, kann man nicht mehr darauf kommen und es sitzt herum und dreht seine Daumen - aber es ist immer noch Speicher zugewiesen.

Irgendwann wird der Garbage Collector aufwachen und nach Variablen suchen, die als nicht verwendet markiert sind. Es wird sie entsorgen und zu diesem Zeitpunkt sind sie überhaupt nicht mehr in Erinnerung.

Es kann als dies komplizierter sein, je nachdem, wie der Garbage Collector funktioniert, aber es ist nah genug :)

3

Eine Variable nicht gleich dem Wert ist es hält.

Die Variable selbst existiert nicht mehr, wenn sie den Gültigkeitsbereich verlässt. Der Wert, den die Variable hielt, kann ein Objekt darstellen, und dieses Objekt kann weiterhin über die Lebensdauer der Variablen hinaus existieren. Der Garbage Collector lädt das Objekt später erneut.

1

Rob Kennedy hat dies richtig beantwortet, aber ich dachte, ich würde ein wenig mehr Details hinzufügen.

Die wichtige Sache zu erkennen ist der Unterschied zwischen einer Variablen und dem Wert, den sie darstellt.

Hier ist ein Beispiel (in C#, weil ich Rubin nicht kennen):

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

In dem obigen Code, NEWOBJ am Ende des if-Anweisung den Gültigkeitsbereich verlässt und als solche „nicht existieren ", aber der Wert, auf den er sich bezieht, ist noch am Leben und gut, referenziert durch c. Sobald alle Verweise auf das Objekt nicht mehr vorhanden sind, kümmert sich der Garbage Collector um die Bereinigung.

0

Wenn Sie über Dateiobjekte sprechen, wird es mehr als eine philosophische Frage. Wenn ich mich richtig erinnere, schließen sich Dateien nicht automatisch, wenn sie den Gültigkeitsbereich verlassen - sie schließen nur, wenn Sie sie zum Schließen auffordern, oder wenn Sie einen File.open do |file| Style-Block verwenden oder wenn sie Müll sammeln.Dies kann ein Problem darstellen, wenn anderer Code (oder Komponententests) versucht, den Inhalt dieser Datei zu lesen, und dieser noch nicht gelöscht wurde.

Verwandte Themen