Domanda

Non sono sicuro di aver compreso l'ambito: esiste una variabile fuori ambito (sto usando Ruby) da qualche parte nella memoria o smette di esistere (so che non puoi accedervi). Sarebbe inesatto affermare che una variabile fuori campo non esiste più?

Forse questa è una domanda filosofica.

È stato utile?

Soluzione

Se stai usando un linguaggio gestito, non allochi e non alloci la memoria per quanto ti riguarda, non esiste più.

Tecnicamente lo fa, ma i GC tendono a non essere deterministici, quindi tecnicamente è difficile dire quando svanisce effettivamente.

Altri suggerimenti

Una variabile non è la stessa del valore che contiene.

La variabile stessa cessa di esistere quando esce dall'ambito. Il valore che la variabile contenuta può rappresentare un oggetto e quell'oggetto può continuare a esistere oltre la durata della variabile. Il Garbage Collector recupera l'oggetto in seguito.

Quando esce dall'ambito esiste ancora (nel senso che ha un po 'di memoria allocata ad esso) per qualche tempo, fino a quando la garbage collection lo ripulisce. Ma come intendi, ha perso il suo nome ed è irraggiungibile.

Quando una variabile non rientra nel campo di applicazione c'è qualcuno in giro per sentirla urlare?

Questa non è una domanda vermiglia quanto una domanda generale sulla raccolta dei rifiuti. In un linguaggio garbage collection come Ruby o C # quando una variabile non rientra nell'ambito è contrassegnata in qualche modo che indica che non è più in uso. Quando ciò accade, non puoi più accedervi e si mette a girare i suoi pollici, ma ha ancora memoria allocata.

Ad un certo punto il Garbage Collector si risveglierà e cercherà le variabili contrassegnate come non in uso. Li eliminerà e a quel punto non saranno più in memoria.

Può essere più complicato di così, a seconda di come funziona il Garbage Collector, ma è abbastanza vicino :)

Esiste per un po 'fino a quando il Garbage Collector non lo dispone (se possibile).

A Rob Kennedy è stata data una risposta appropriata, ma ho pensato di aggiungere qualche dettaglio in più.

La cosa importante da riconoscere è la differenza tra una variabile e il valore che rappresenta.

Ecco un esempio (in C # perché non conosco Ruby):

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

Nel codice sopra, newObj esce dall'ambito alla fine dell'istruzione if e come tale "non esiste", ma il valore a cui si riferiva è ancora vivo e vegeto, a cui fa riferimento c. Una volta che tutti i riferimenti all'oggetto sono spariti, il Garbage Collector si occuperà di ripulirlo.

Se stai parlando di oggetti file, diventa più che una domanda filosofica. Se ricordo bene, i file non si chiudono automaticamente quando escono dall'ambito: si chiudono solo se chiedi loro di chiudere, o se usi un blocco di stile File.open do | file | , oppure se ricevono la spazzatura raccolta. Questo può essere un problema se un altro codice (o unit test) tenta di leggere il contenuto di quel file e non è stato ancora scaricato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top