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

Langage Delphi Discussion :

[D6] Fuite de mémoire


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut [D6] Fuite de mémoire
    Bonjour a tous

    Le programme a une fuite de mémoire.

    En isolant les appels de procedure comme suit, la fuite est "cerné"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    type tarraySW=record
        Donnees:array[0..4000,0..20]of double;
        Ok:boolean;
    end;
     
    var
    ...
        avant,apres:integer;
        Mem:TMemoryStatus;
    begin
    ...
                Mem.dwLength:=SizeOf(TMemoryStatus); GlobalMemoryStatus(Mem); avant:=Mem.dwAvailPhys;
                if not direct(DonneesBrutes, References, DonneesFiltrees) then beep;
                Mem.dwLength:=SizeOf(TMemoryStatus); GlobalMemoryStatus(Mem); apres:=Mem.dwAvailPhys;
                memo2.lines.Add('direct '+inttostr(apres-avant));avant:=apres;//15 s'affiche
    ...
    Bon on sait que c'est la routine qui est fautive... Même petit manège...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function TForm1.Direct(const Donnees:string;const References:tstringlist;var Filtrees:tarraySw):boolean;
    var
        avant,apres:integer;
        Mem:TMemoryStatus;
     
    ...
    begin
        Mem.dwLength:=SizeOf(TMemoryStatus); GlobalMemoryStatus(Mem); avant:=Mem.dwAvailPhys;
        ...
        Mem.dwLength:=SizeOf(TMemoryStatus); GlobalMemoryStatus(Mem); apres:=Mem.dwAvailPhys;
        memo2.lines.Add('direct '+inttostr(apres-avant));avant:=apres;//0 s'affiche
    end;
    Donc il appaire que la fuite se ferait au niveau de l'appel de la routine, mais non lors de son exécution

    Est-ce que vous voyez la cause?

    Merci d'avance

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    Un appel ne peut pas produite de fuite mémoire, seul le code d'une fonction le peut.
    La mémoire disponible n'est pas un bon indicateur pour détecter les fuites mémoires.

    En Delphi 7, j'utilisais MemCheck comme outil pour les fuites mémoires. Cela t'indique le type de données restant en mémoire.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Parfait Merci

    A+

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Un appel ne peut pas produite de fuite mémoire, seul le code d'une fonction le peut.
    La mémoire disponible n'est pas un bon indicateur pour détecter les fuites mémoires.

    En Delphi 7, j'utilisais MemCheck comme outil pour les fuites mémoires. Cela t'indique le type de données restant en mémoire.
    FastMM est un gestionnaire de mémoire qui remplace avantageusement le gestionnaire de mémoire fourni par Borland et qui permet (un avantage parmi d'autres) de détecter finement les fuites de mémoire : http://sourceforge.net/projects/fastmm/
    Ce gestionnaire est d'ailleurs celui fourni par défaut depuis Delphi 2006...

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

Discussions similaires

  1. fuite de mémoire ?
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 12/01/2006, 17h19
  2. Réponses: 1
    Dernier message: 02/12/2005, 15h18
  3. fuite de mémoire
    Par mamag dans le forum MFC
    Réponses: 17
    Dernier message: 19/08/2005, 11h42
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 21h44
  5. Réponses: 8
    Dernier message: 17/10/2002, 13h52

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