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 :

Exception et Gestion de la mémoire


Sujet :

Langage Delphi

  1. #1
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut Exception et Gestion de la mémoire
    Bonjour,

    J'ai un petit soucis, je n'arrive pas a liberer la mémoire apres
    une exception, j'ai beau faire un Free; mais rien n'y fait.

    Le hic, c'est que le composant qui leve cette exception n'est
    pas de moi et disons que je n'ai pas accés aux sources.

    Donc en gros ça donne ça .

    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
     
    function estCrypté(chaine : String) : boolean;
    var
    b : boolean;
    aes : TMclasse;
    begin
      b:=true;
      try
        aes.decryptString(chaine);
        except
          b:=false;
       end;
     estcrypte:=b;
    aes.free;
    end;
    Bon, c 'est pas le code exacte mais en gros c'est ça.
    Y a t-il une particularité pour les exceptions au meme titre que pour
    les destructions ?

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Assure-toi de la destruction d'aes avec un try..finally.

    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
    function EstCrypte(const chaine: string): Boolean;
    var
      aes: TMclasse;
    begin
      Result := True;
      aes := TMclasse.Create; // ?
      try
        try
          aes.decryptString(chaine);
        except
          Result := False;
        end;
      finally;
        aes.Free;
      end;
    end;
    J'ai rajouté l'appel à Create qui doit trainé par là je suppose.

    @+ Claudius

  3. #3
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    oui oui le create est bien par la

    Il se detruit bien, aucun message d'erreur avec un except.

    Si c'est déclaré en local, en principe, tout est liberé a la fin de l'excution
    de la fonction non ?

  4. #4
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    En plus si j'appel cette meme fonction en faisant en sorte que l'exception
    ne se leve pas, il n'y aucun soucis. la memoire est correctement libéré.

    Si la classe que j'appelle crée elle meme d'autre instance d'une autre classe,
    est-ce possible que ce soit ces instances la qui ne sont pas libérés ?

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Aos Voir le message
    En plus si j'appel cette meme fonction en faisant en sorte que l'exception ne se leve pas, il n'y aucun soucis. la memoire est correctement libéré.
    C'est tout l'intérêt du try .. finally qui t'assure la libération qu'une exception soit levée ou non.

    Citation Envoyé par Aos Voir le message
    Si la classe que j'appelle crée elle meme d'autre instance d'une autre classe, est-ce possible que ce soit ces instances la qui ne sont pas libérés ?
    C'est au destructeur de ta classe de s'assurer de la libération des objets qu'elle a elle-même créés.

    [Edit]
    Citation Envoyé par Aos Voir le message
    Si c'est déclaré en local, en principe, tout est liberé a la fin de l'excution de la fonction non ?
    Ah non l'instance de ta classe sera toujours présente, et paf fuite de mémoire.

    @+

  6. #6
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    ok, mais alors comment expliques- tu que lorsque l'exception n'est pas levée,
    la mémoire est bien libérée alors que quand elle est levée, la mémoire
    ne se libère plus ?

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Si si, la ligne aes.Free sera executée, exception levée ou pas.

    Tu as bien repris mon exemple de code ?

  8. #8
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    oui oui, j'avais déjà essayé comme ça
    mais pour être sur, j'ai ressayé et c'est pareil.

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Montre-nous la fonction EstCrypte telle que tu l'as modifié.

  10. #10
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    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
    17
    18
    19
    20
    function estCrypte(chaine : string) : boolean;
    var
    b : boolean;
    tempRi : TlbRijndael;
    begin
     
    creation de tempRI;
     
    b:=true;
    try
      try
       tempRi.DecryptString(chaine)
       except
         b:=false;
       end;
      finally
       tempRi.free;
    end;
      estCrypte:=b;
    end;

  11. #11
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Si ta fonction est bien construite ainsi, pas de soucis.
    tempRi.free sera toujours exécuté.

  12. #12
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    oui oui c'est comme ça, j'ai juste zippé la construction.

    C'est le composant TplockBox 2.07 et j'utilise Aes rijndael, il doit y avoir
    un problème dedans. Je vais me plonger dans les sources des que
    j'aurai un peu de temps...

    Ça peut venir que de la...

    Je laisse le thread encore ouvert pour voir si quelqu'un a deja eu
    la même péripétie et je le fermerai en soirée.

    En tout cas merci a toi claudius

  13. #13
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Petite remarque, tu n'es pas obligé d'utiliser la variable b, l'affectation du resultat ne termine pas la fonction (comme en C par exemple). Tu peux faire :
    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
    17
    18
    function estCrypte(chaine : string) : boolean;
    var
    tempRi : TlbRijndael;
    begin
     
    creation de tempRI;
     
    Result :=true;
    try
      try
       tempRi.DecryptString(chaine)
       except
         Result:=false;
       end;
      finally
       tempRi.free;
    end;
    end;

  14. #14
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Il quand même assez étonnant que pour tester si une chaine est cryptée ton composant n'est pas d'autres manière de répondre que par une exception !

  15. #15
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    hello!

    @guillemouze : Oui c'est effectivement une sale habitude de Java Merci

    @peter : Bah oui, même moi ça me fait flipper, mais j'ai vraiment rien trouvé
    dans la doc que j'ai parcouru plusieurs fois. A moins que je l'ai loupé mais
    vraiment c'est le seul moyen que j'ai trouvé pour savoir si c'était crypté ou non.
    Je vais rereregarder en espérant trouver cette fois.

    Mais de toute façon, ça ne règle en rien cette satanée fuite de mémoire .

    Lorsque j'aurai mis le doigt dessus, ça va barder!!

  16. #16
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Aos Voir le message
    hello!

    @guillemouze : Oui c'est effectivement une sale habitude de Java Merci

    @peter : Bah oui, même moi ça me fait flipper, mais j'ai vraiment rien trouvé
    dans la doc que j'ai parcouru plusieurs fois. A moins que je l'ai loupé mais
    vraiment c'est le seul moyen que j'ai trouvé pour savoir si c'était crypté ou non.
    Je vais rereregarder en espérant trouver cette fois.

    Mais de toute façon, ça ne règle en rien cette satanée fuite de mémoire .

    Lorsque j'aurai mis le doigt dessus, ça va barder!!

    Ce serait bien de voir le code de decryptString afin de voir ce qu'il fait et ce qui est susceptible de le faire "planter" comme ça.

    Ainsi toi en amont tu pourrais déjà faire une batterie de test avant d'appeler cette fonction (caractères indésirables, ... ?).

    Ainsi tu aurais pas à passer par une exeption et tu aurais peut être plus le pb de la mémoire qui fuit (sinon mets de la 5W50).

  17. #17
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    Voila la procédure qui plante...
    Je suis en train de parcourir le code pour voir ou est cette fameuse fuite de mémoire.


    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    procedure LbDecodeBase64(InStream, OutStream : TStream);
    var
      I, O, Count, c1, c2, c3 : Byte;
      InBuf  : array[0..87] of Byte;
      OutBuf : array[0..65] of Byte;
    begin
      repeat
        O := 0;
        I := 0;
     
        Count := InStream.Read(InBuf, SizeOf(InBuf));
        if (Count = 0) then
          Break;
     
        { Decode data to output stream }
        while I < Count do begin
          if (InBuf[I] < 43) or (InBuf[I] > 122) or
             (InBuf[I+1] < 43) or (InBuf[I+1] > 122) or
             (InBuf[I+2] < 43) or (InBuf[I+2] > 122) or
             (InBuf[I+3] < 43) or (InBuf[I+3] > 122) then
            raise Exception.Create('Invalid Base64 Character');
     
          c1 := LbD64Table[InBuf[I]];
          c2 := LbD64Table[InBuf[I+1]];
          c3 := LbD64Table[InBuf[I+2]];
          OutBuf[O] := ((c1 shl 2) or (c2 shr 4));
          Inc(O);
          if Char(InBuf[I+2]) <> '=' then begin
            OutBuf[O] := ((c2 shl 4) or (c3 shr 2));
            Inc(O);
            if Char(InBuf[I+3]) <> '=' then begin
              OutBuf[O] := ((c3 shl 6) or LbD64Table[InBuf[I+3]]);
              Inc(O);
            end;
          end;
          Inc(I, 4);
        end;
        OutStream.Write(OutBuf, O);
      until Count < SizeOf(InBuf);
    end;

  18. #18
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    Je crois que le problme vient de la, si la fonction LbEncodeBase64 plante,
    alors les in,out,work Stream ne sont pas libérés.
    Je teste ça et je tiens au courant...

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    function RDLEncryptStringEx(const InString : string;
                const Key; KeySize : Longint; Encrypt : Boolean) : string;
    var
      InStream  : TMemoryStream;
      OutStream : TMemoryStream;
      WorkStream : TMemoryStream;
    begin
      InStream := TMemoryStream.Create;
      OutStream := TMemoryStream.Create;
      WorkStream := TMemoryStream.Create;
      InStream.Write(InString[1], Length(InString));
      InStream.Position := 0;
     
      if Encrypt then begin
        RDLEncryptStream(InStream, WorkStream, Key, KeySize, True);
        WorkStream.Position := 0;
        LbEncodeBase64(WorkStream, OutStream);
      end else begin
        LbDecodeBase64(InStream, WorkStream);
        WorkStream.Position := 0;
        RDLEncryptStream(WorkStream, OutStream, Key, KeySize, False);
      end;
      OutStream.Position := 0;
      SetLength(Result, OutStream.Size);
      OutStream.Read(Result[1], OutStream.Size);
     
      InStream.Free;
      OutStream.Free;
      WorkStream.Free;
    end;

  19. #19
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    Je confirme (avec GRAND plaisir ) que la fuite de memoire se situait bien la...

    Je vais voir si j'arrive à joindre l'auteur de se composant pour le prévenir.

    Merci à tous

  20. #20
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Aos Voir le message
    Je confirme (avec GRAND plaisir ) que la fuite de memoire se situait bien la...

    Je vais voir si j'arrive à joindre l'auteur de se composant pour le prévenir.

    Merci à tous
    Content de t'avoir mis sur la bonne voie !!!

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/02/2006, 13h03
  2. gestion de la mémoire
    Par moldavi dans le forum C++
    Réponses: 17
    Dernier message: 05/02/2005, 00h18
  3. Réponses: 11
    Dernier message: 26/12/2004, 23h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 16h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 13h44

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