Je suis désolé si c'est une question évidente, mais ni Google ni une recherche ici ne m'ont amené à une réponse.
Est-il possible de supprimer entièrement un tableau?
Je veux le ci-contre de int[] array = new int[5]
Dis tu appelles:
void Foo(){
int[] a = new int[5];
}
En C #, il n’existe aucun moyen de définir la variable a
. Cela signifie que a
sera défini dans Foo
même si vous définissez a
sur null. Cependant, à la fin de Foo
a
sera hors de portée. Cela signifie qu'aucun code ne peut le référencer, et le ramasse-miettes se chargera de libérer la mémoire pour vous lors de sa prochaine exécution, ce qui risque de ne pas être long.
Vous devez simplement le laisser sortir de son cadre et attendre que GC le trouve. ce qui pourrait ne pas être immédiat (en fait, ce ne sera presque certainement pas le cas). Si vous avez un champ sur un objet de longue durée (qui restera dans la portée), vous pouvez définir sur null, ce qui peut aider.
Vous pouvez influencer le GC pour qu'il collectionne plus tôt (pas seulement votre objet: tout ce qui est éligible), mais vous devriez rarement si jamais le faire. Je ne l'utilise que sur des bancs d'essai; mais:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); // DON'T DO THIS!!!
pour plus sur GC.Collect
:
Il n'est pas nécessaire de supprimer le tableau, le GC s'en occupera.
(Très) simpliste:
Lorsque vous manquez de mémoire, le ramasse-miettes se met en marche, arrêtez votre code et parcourez tous les objets en direct en mémoire.
live signifie une référence sur la pile, un registre, une référence statique et quelques autres éléments connus collectivement sous le nom de 'GC Roots'. En les traversant, il constate qu'ils sont en vie.
Si votre tableau n'est plus en vie, rien ne peut plus y accéder (c'est ce qui détermine la vivacité), de sorte que la mémoire qu'il occupe sera disponible pour la réutilisation.
Il y a peut raison d'attribuer la référence à la valeur null si les références restent actives plus longtemps que souhaité ou si elles contiennent une grande quantité de mémoire dont vous avez besoin immédiatement, mais cela peut facilement se retourner contre le tableau. vivre plus longtemps. Les variables d'instance plutôt que de pile sont de meilleurs candidats pour cette optimisation si l'instance contenant a une durée de vie considérablement plus longue que le tableau qu'elle contient.
Pour être clair, en tant que débutant, vous ne devriez pas envisager ce genre de chose, laissez le GC faire son travail et n'essayez de l'aider que lorsque:
Vous devriez lire l'article de Chris Brumme sur le sujet ; les premiers paragraphes devraient expliquer la situation.
Et quiconque suggérant "assigner null à la variable" doit prendre en note la partie qui dit:
Même si vous ajoutez «aC = null;» après votre utilisation, le JIT est libre de considérer cette affectation comme un code mort et de l'éliminer.
array = null, mais je pense que ce serait une bonne idée de lire un peu le modèle de gestion de la mémoire .NET pour comprendre pourquoi.
Juste pour clarifier les choses au cas où vous ne comprendriez pas la terminologie exprimée dans les autres réponses, GC signifie garbage collector. Les langues comme C # qui ont une gestion automatique de la mémoire vous permettent de vous concentrer sur ce qui doit être fait et de ne pas vous soucier de ce que vous créez et du moment de le supprimer. Le GC fonctionne en examinant périodiquement tous les objets que vous créez et en vérifiant s’ils contiennent des références. Sinon, cela signifie qu'il est impossible de faire quoi que ce soit avec eux. Par conséquent, ils pourraient tout aussi bien être supprimés, et c'est ce que fait le système.
Pour plus de détails, voir http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
Le plus proche est d’attendre qu’elle sorte de sa portée ou la définisse à null.
Il ne supprimera pas ou ne supprimera pas le tableau immédiatement, mais après avoir supprimé toutes les références au tableau, le ramasse-miettes (GC) le supprimera à temps ...
Vous pouvez déclarer et initialiser votre tableau dans une instruction if (true) {}. En dehors de l'instruction if (après celle-ci), la variable de tableau n'est pas accessible et sera donc supprimée.
En C++, on peut utiliser le effacer mot-clé. Et il a été mentionné à l'origine dans ce commentaire et dans d'autres commentaires. L'historique d'édition montre cela. C’est une solution viable (bien que la réponse secondaire) même si d’autres ne comprennent pas pourquoi. Je dis cela car on peut y trouver sa propre solution élégante, s’ils comprennent plus d’une langue.
Dans .NET/MSIL, vous avez le mot-clé delete, mais il s'appelle nom de variable.Disposer(). Je propose cette solution car elle supprime toutes les références à la variable et la place dans un état de préparation au ramassage des ordures. Une autre option consiste à définir la variable égale à nul Dans le cas contraire, la variable restera sous la forme d'un objet typé, mais restituera ce qu'elle a contenu dans la corbeille afin qu'elle puisse être réaffectée ultérieurement.
Commentaire original/Réponse:
La récupération de place pour C # est excellente, mais vous devez parfois supprimer une variable de la mémoire et en créer une nouvelle instance, sans qu'aucune autre partie de votre programme ne la maintienne en vie. Il est possible de placer potentiellement le bloc de mémoire existant détenu par la matrice dans un état GC, en pointant la matrice vers une nouvelle mémoire, telle que:
aMyArray = new int[];
Le principal problème que je vois de cette façon, cependant, est que vous ne voulez vraiment pas perdre une tonne de mémoire, puis que tout s'arrête brusquement au fur et à mesure que GC démarre, car le système d'exploitation est en panique. Je maintiens cette idée, considérant que C Sharp est maintenant un langage courant et qu'il est utilisé dans BEAUCOUP d'applications différentes, y compris les jeux d'écriture ... Ce serait vraiment bien si C Sharp n'agissait pas de manière similaire à ActionScript/FLASH le respect.