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

Composants VCL Delphi Discussion :

Libérer une form, pb memoire pas totalement rendu.


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 15
    Points : 585
    Points
    585
    Par défaut Libérer une form, pb memoire pas totalement rendu.
    Bonjour,

    J'ai dans une unité la procedure suivante, plutôt basique. Pourtant si la création et le showmodal marche, le free me pose
    des soucis. La libération de la mémoire utilisé n'est pas total.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TTestPrinc.TestFmCreate;
    begin
       fmPrinc := nil; // pour ne pas avoir : "fmPrinc 
                           // n'est peut être pas init" :)
       try
         fmPrinc:= TfmPrinc.create(nil);
         fmPrinc.ShowModal;
       finally
         fmPrinc.Free;
       end;
    end;
    Mon control me donne au départ 58432 puis 195948557 : après la libération. Plus bizarre, si ce testfmCreate est lançé plusieurs fois, je n'ai plus de différence de memoire (58456 avant et après) .

    J'aimerais vraiment savoir pourquoi j'ai ce comportement. J'ai essayé d'attendre (avec un showmessage), d'utiliser freeandnil à la place du free et même un freeandnil avec une boucle d'attente du nil. TestFmCreate plante invariablement la première fois (je la relance avec un bouton) mais pas les suivantes.

    Pour le contrôle, je note la mémoire dispo avant l'appel et je compare après l'appel la nouvelle valeur. J'utilise getHeapStatus.Totalallocated pour récupérer cette valeur.

    D'avance merci.

    Flash Koti[/code]

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Pour détecter les fuites mémoire, utilises MemChec, c'est un outil qui est conçu pour.
    Ta construction semble correcte. Pour supprimer cet avertissemement, sors la ligne créant la form du bloc try...finally (ton assignation à nil n'est pas utile).
    "It's more fun to compute !"

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 15
    Points : 585
    Points
    585
    Par défaut
    Bonjour,

    Merci pour l'aide. En effet, si le create réussit alors il sera forcement libèrer par le finally mais si le showmodal provoque lui une execption et si le create échoue, bah il n'y a rien à libérer.

    J'avoue que j'ai du réflechir un petit peu avant d'en arriver à cette conclusion. Je sais pas pourquoi je pensais qu'il fallait aussi protéger le create.

    Par contre, pour la fuite de mémoire... Je viens de tester avec memcheck que tu m'as indiqué. Lui ne voit pas de perte de mémoire. Alors je me dit que le problème vient peut être du test de detection (mais à part pour les formes, j'ai pas de soucis). Je vais mettre ce post en resolu et en poster un autre sur le controle de la mémoire.

    Merci, encore.

    Flash Koti

  4. #4
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Utilise à la place de si tu utilises la version 7 de Delphi. Free ne libère pas la totalité des ressources
    7 fois à terre, 8 fois debout

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 15
    Points : 585
    Points
    585
    Par défaut
    Bonjour,

    Attention, si ça n'a pas changé depuis delphi 5 (c'est la version que j'utilise). C'est bien free que je dois utiliser car je ne suis pas dans l'unité de la form.

    Par contre, si on veut libérerla form depuis son unité et surtout depuis un de ses composants (exemple dans l'évenement on click d'un bouton), c'est obligatoirement release qu'il faut utiliser. Release permet d'appeler free en s'assurant que du code de la form n'est pas actif (peut être faut-il utiliser release dans le cas de thread ou traitement multitache). Sinon on s'expose à des erreurs de violation (les autres gestionnaires risque de vouloir acceder à une form qui n'existe plus).

    Bon, je suis pas spécialiste et je peux me tromper. J'ai longuement lut et relut l'aide de delphi sur free et release pour arriver à cette conclusion.

    A propos du free, il existe aussi freeandnil qui fait la même chose mais affecte nil à l'objet au final. ça peut être intéressant dans le cas de projet qui doivent vérifier si une instance de l'objet est crée (à ma connaissance, il n'y a pas de méthode qui indique cet état donc à part test le nil...). Ah, oui comme on peut s'en douter le free n'affecte pas nil à l'objet (je trouve pas ça top mais bon).

    Par contre, pourquoi free ne libère pas tout, c'est quoi ce travail de fainéant ? Qu'est ce que tu veux dire par là ? C'est peut être un changement ds la version 7 mais je trouverai ça extrement bizarre.

    Voilà, et merci quand même. Surtout si j'ai tord , n'hésitez pas à me le dire. Comme je l'ai dit plus haut, je suis pas expert en free/release

    Flash koti

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/10/2012, 19h30
  2. libérer une forme un seul clique
    Par madjid90 dans le forum Débuter
    Réponses: 5
    Dernier message: 21/07/2010, 16h35
  3. Réponses: 8
    Dernier message: 15/09/2006, 19h37
  4. Caractères spéciaux à ne pas passer dans une form
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/03/2006, 12h39
  5. Comment afficher une form dont les dimensions ne dépendent pas de la résolution sous
    Par The Freestyler Fou dans le forum Vos contributions VB6
    Réponses: 1
    Dernier message: 10/09/2005, 15h05

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