Question

Je ne suis pas sûr de comprendre la portée - une variable hors de la portée (j'utilise Ruby) existe-t-elle dans la mémoire quelque part ou cesse-t-elle d'exister (je sais que vous ne pouvez pas y accéder). Serait-il inexact de dire qu'une variable hors champ n'existe plus?

C'est peut-être une question philosophique.

Était-ce utile?

La solution

Si vous utilisez un langage géré, vous n'allouez et ne désaffectez pas la mémoire. En ce qui vous concerne, cette mémoire n'existe plus.

Techniquement, oui, mais les GC n’ont pas tendance à être déterministes, donc techniquement, il est difficile de dire quand il disparaîtra.

Autres conseils

Une variable n’est pas la même chose que la valeur qu’elle détient.

La variable elle-même cesse d'exister lorsqu'elle sort de la portée. La valeur que la variable détenue peut représenter un objet et cet objet peut continuer d'exister au-delà de la durée de vie de la variable. Le ramasse-miettes récupère l'objet ultérieurement.

Lorsqu'il est hors de portée, il existe toujours (dans le sens où de la mémoire lui est allouée) pendant un certain temps, jusqu'à ce que garbage collection le nettoie. Mais comme vous le dites, il a perdu son nom et est inaccessible.

Quand une variable est hors de portée, y a-t-il quelqu'un autour pour l'entendre crier?

Ce n’est pas une question de rubis, mais une question générale sur le ramassage des ordures. Dans un langage usé tel que Ruby ou C #, lorsqu'une variable tombe en dehors de la portée, elle est marquée d'une manière qui indique qu'elle n'est plus utilisée. Lorsque cela se produit, vous ne pouvez plus vous en occuper et il tourne autour de ses pouces, mais la mémoire lui est toujours attribuée.

À un moment donné, le ramasse-miettes va se réveiller et rechercher les variables marquées comme non utilisées. Il en disposera et à ce moment-là, ils ne seront plus du tout en mémoire.

Cela peut être plus compliqué que cela, en fonction du fonctionnement du ramasse-miettes, mais il est suffisamment proche:)

Il existe un petit peu jusqu'à ce que le ramasse-miettes le jette (s'il le peut).

Rob Kennedy a bien répondu à cette question, mais je pensais ajouter un peu plus de détails.

La chose importante à reconnaître est la différence entre une variable et la valeur qu’elle représente.

Voici un exemple (en C # car je ne connais pas Ruby):

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

Dans le code ci-dessus, newObj sort du domaine à la fin de l'instruction if et en tant que tel "n'existe pas", mais la valeur à laquelle il faisait référence est toujours bien vivante, référencée par c. Une fois que toutes les références à l'objet ont disparu, le ramasse-miettes se charge de le nettoyer.

Si vous parlez d'objets de fichier, cela devient plus qu'une question philosophique. Si je me souviens bien, les fichiers ne se ferment pas automatiquement lorsqu'ils sortent de leur champ d'application. Ils ne se ferment que si vous leur demandez de fermer ou si vous utilisez un bloc de style File.open do | file | , ou s'ils ramassent les ordures. Cela peut poser problème si un autre code (ou des tests unitaires) essaie de lire le contenu de ce fichier et qu'il n'a pas encore été vidé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top