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

Delphi Discussion :

Nettoyage de mémoire.


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut Nettoyage de mémoire.
    Bonjour à tous.tes,
    Quelqu'un connaîtrait-il, si ça existe, un moyen de résorber des fuites de mémoire sans forcément connaître les objets fautifs. Peut-être en demandant leur identité à Windows afin de pouvoir les libérer ?
    Je travaille sur une appli qui gère un grand nombre de collections d'objets du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TObjectDictionary<String, TObjetsANous>;
    dont la libération n'a pas été gérée lors de leur développement
    Du coup, c'est extraordinairement compliqué à tracer les fuites de mémoires, maintenant

  2. #2
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 952
    Points
    1 952
    Par défaut
    Bonjour,

    C'est clair que cela peut être complexe la recherche de fuites mémoire surtout lorsque des listes d'objets ne peuvent pas être libérés par l'unité qui les a créé car ces listes sont utilisées par d'autres...

    Est ce que tu utilises un programme pour cela ? Pour ma part j'utilise FastMM qui est pas mal de tout mais il y en a d'autres.

    Concernant TObjectDictionary, le mieux est d'avoir TDictionaryOwnerships = doOwnsValues car c'est libéré automatiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        l_Liste := TObjectDictionary<String, TObjet>.create([doOwnsValues]);

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Bonjour Free07 et merci pour ta réponse.
    Je n'ai pas bien compris où j'avais créé ce post en premier.
    Du coup, je viens de le retrouver grâce à toi
    TDictionaryOwnerships = doOwnsValues
    Très intéressant, je vais voir ça.
    Merci beaucoup.

    Pour les fuites mémoire, je suis très classique avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ReportMemoryLeaksOnShutdown := DebugHook > 0;

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Nope, change rien

  5. #5
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 952
    Points
    1 952
    Par défaut
    Citation Envoyé par DOliv Voir le message
    Pour les fuites mémoire, je suis très classique avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ReportMemoryLeaksOnShutdown := DebugHook > 0;
    il faut mettre aussi les options pour qu'il génère un fichier qui permet d'analyser les problèmes mémoire

    Lors de la fin de ton programme, il génère un fichier texte qui contient les détails des problèmes mémoire : NomDeTonProgramme_MemoryManager_EventLog, les 3 options que j'ai activé dans le .inc sont affichés en commentaire comme tu peux le voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {$IFDEF Debug} 
      {$INCLUDE FastMM4Options.inc}
      (* les options de FastMM sont à établir dans le fichier .inc et non pas ci dessous
      {$define FullDebugMode}
      {$define LogErrorsToFile}
      {$define LogMemoryLeakDetailToFile}
      *)
    {$ENDIF }

  6. #6
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    Points : 243
    Points
    243
    Par défaut
    De mon côté, j'utilise madExcept qui propose également un rapport des fuites mémoires.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Petit complément d'infos pour effectuer tes recherches:
    Lorsque tu fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vListe := TObjectDictionary<String, TMonObjet>.create([doOwnsValues]);
    Cela permet de libérer automatiquement l'objet (ou les objets suivant l'appel) "TMonObjet" lorsque tu fais un Delete, Clear, ou Free.
    Si tu ne mets pas "doOwnsValues", c'est pareil que déclarer ta liste comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vListe: TDictionnary<string, TMonObject>;
    Mais il ne faut pas oublier si ton objet "TMonObjet", contient lui même des objets, ceux-ci ne seront pas automatiquement libérer, malgré le "doOwnsValues".
    Exemple, si tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vListe := TObjectDictionary<String, TList<TAutreObjet>>.create([doOwnsValues]);
    Lorsque tu fais un clear, les "TList" de ton vListe seront libérés, mais pas tous les "TAutreObjet" de chaque "TList" de vListe.

Discussions similaires

  1. Nettoyage clés
    Par michel.boissinot dans le forum Windows XP
    Réponses: 11
    Dernier message: 14/07/2005, 14h00
  2. Nettoyage de table temporaire
    Par Alain Dionne dans le forum Bases de données
    Réponses: 5
    Dernier message: 28/02/2004, 21h44

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