IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

libération mémoire avec List<T>


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    février 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : février 2007
    Messages : 108
    Points : 78
    Points
    78
    Par défaut libération mémoire avec List<T>
    Bonjour à tous, je me pose une question quand à l'utilisation de la méméoire avec les list<T>.

    Sauf mauvaise erreur de ma part, il me semble que les list<T> ne contiennent pas les object proprement dit mais bien des pointeurs vers les objects.

    Donc dans le cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    List<T> lst = new List<T>();
     
    // code de remplissage de lst par des object T crées ailleurs...
     
    lst = null; //Vide la list car plus besoins
    le code lst = null supprime uniquement les pointeurs mais pas les objects. Comment faire alors pour supprimer les objects et libérer de la mémoire?

    Merci

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    avril 2007
    Messages
    13 989
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : avril 2007
    Messages : 13 989
    Points : 24 721
    Points
    24 721
    Par défaut
    mettre un objet dans une variable référence celui ci (la variable contient un pointeur vers l'adresse mémoire de l'objet)
    un même objet peut être référencé par plusieurs choses (comme être dans un list + dans une variable)

    les objets qui ne sont plus référencés sont supprimés automatiquement de la mémoire
    par contre ce n'est ni immédiat, ni déterministe, il y a un garbage collector qui passe de temps en temps et qui supprime tout ce qui n'est plus utilisé (parfois suite à une demande de windows qui a besoin de mémoire pour autre chose il me semble)

    donc la mémoire en théorie on s'en soucie peu

    par contre en .net il y a des objets qui ne sont pas gérés en .net mais par des dll externes
    la mémoire dans ces dll externes ne peut pas être gérée par le garbage collector, il faut donc dans ce cas préciser qu'on veut libérer la mémoire d'une classe non managée quand on en a plus besoin
    pour ca il y a la méthode Dispose (sur les classes qui gèrent ça donc)

    mais là aussi il y a un mécanisme pour qu'une classe qui utilise du code non managé libère la mémoire non managée quand le garbage collector libère la mémoire managée
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    novembre 2010
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : novembre 2010
    Messages : 372
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    La méthode ou encore vide aussi la liste et le GC se chargera de libérer la mémoire.

    Cordialement.
    La recherche de la connaissance est une Lumière qui apaise le Cœur.
    Si une réponse vous a été utile , n'oubliez pas de voter en cliquant sur:.

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    juin 2007
    Messages
    862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : juin 2007
    Messages : 862
    Points : 1 846
    Points
    1 846
    Par défaut
    Citation Envoyé par agparchitecture Voir le message
    le code lst = null supprime uniquement les pointeurs mais pas les objects. Comment faire alors pour supprimer les objects et libérer de la mémoire?
    Pour faire court, tu ne t'en occupes pas. Les langages à gestion de mémoire automatisée (vb, java, c#, javascript, php) ont justement été créés pour ne pas avoir à s'occuper de ce genre de problèmes récurrent, comme en c ou c++. C'est le ramasse-miettes (garbage colector) qui va libérer la mémoire au moment où il en a besoin ou si une période de moindre activité de l'application laisse le gc s'activer. Il est également possible d'appeler soi-même le garbage collector GC.Collect(); mais en pratique c'est rarement nécessaire ; le travail du gc est du temps d'exécution qui n'est pas consacré au fonctionnement de l'application alors autant le laisser tourner de lui-même. Ton application avec le formulaire aux 630000 lignes pourrait être un des rares cas où vider immédiatement la mémoire (à la fermeture du formulaire, si l'application continue à tourner) aurait un sens.

  5. #5
    Expert confirmé
    Inscrit en
    avril 2008
    Messages
    2 545
    Détails du profil
    Informations personnelles :
    Âge : 62

    Informations forums :
    Inscription : avril 2008
    Messages : 2 545
    Points : 4 351
    Points
    4 351
    Par défaut
    bonjour

    List<T> crée un Array interne pour stocker les references aux objets...

    Pour libérer la mémoire d'un List<> il faut le "Nullifier" ce qui "nullifie" son Array interne....
    Encore mieux ,si tu "nullifies" le List<> source de données lui-même !!!

  6. #6
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    février 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : février 2007
    Messages : 108
    Points : 78
    Points
    78
    Par défaut
    Merci pour toute les remarques et conseils.

    En ait, j'étais juste trop impatient, le garbage collector passe bien mais pas juste après le vidage de la List<>. Donc plus de problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème libération mémoire avec Delphi 7
    Par stef32550 dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/08/2012, 19h40
  2. Listes Chainées et libération mémoire?
    Par alexglvr dans le forum Débuter
    Réponses: 16
    Dernier message: 19/01/2011, 13h14
  3. Réponses: 5
    Dernier message: 12/05/2010, 12h20
  4. Problème de libération de mémoire avec free()
    Par Nival dans le forum Débuter
    Réponses: 8
    Dernier message: 19/03/2009, 00h06
  5. Libération de la mémoire avec un std::map !
    Par kris1980 dans le forum SL & STL
    Réponses: 8
    Dernier message: 25/04/2008, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo