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 :

Affectation et libération mémoire d'une WideString


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut Affectation et libération mémoire d'une WideString
    Bonjour,

    j'aimerais savoir si ce code libère bien autant de mémoire qu'il n'en alloue (je décale le #0 terminal d'un cran dans la variable vMot)

    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
    Var
      vEntree : String
      vPMot : PWideChar;
      vMot : WideString; 
      vLen: Cardinal;
    begin
     
    vLen := Length(vEntree)* SizeOf(WideChar) + 1;
    vPVers := AllocMem(vLen);
     
    vMot := vPMot;
    ....   
     for k := vCurseur to vLen do
          vMot[k] := vMot[k+1];
    dec(vLen);
    ...
    FreeMem(vPVers);
    end;
    le vPMot me sert dans une liste.

    Merci pour vos infos

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    ton code est incompréhensible

    quelle version de Delphi utilises-tu ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    J'utilise D2005 personnal.

    Ce code est peut-être incompréhensible, mais il marche : je récupère du unicode dans delphi, et les valeurs récupérées s'affichent avec un affichage tel qu'attendu.

    Cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    
    
    URLDecodeUTF8(PAnsiChar(vEntree), vPMot, vLen);
    vMot:= vPMot;
    que je n'avais pas mise, rendra peu être l'usage du code plus compréhensible

    Mon pointeur vPMot est destiné à être manipulé dans une TList, vMot me sert pour filtrer certains caractères, et au lieu de recopier toute la chaine, je shifte la fin de chaine ( un décalage, quoi), depuis le curseur

    Mais est-ce que je libère bien ainsi toute la mémoire allouée, en faisant ces manips (sans doute peu orthodoxes) ? C'est la question que je me pose .

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    question débile

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    on reprend...
    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
     
    Var
      vEntree : String
      vPMot   : PWideChar;
      vMot     : WideString; 
      vLen      : Cardinal;
    begin
     
    // pour ajouter un #0 Wide, c'est +2
     
     vLen := Length(vEntree)* SizeOf(WideChar) + 1;
     
    // ici je suis obligé de supposé que vPVers est en fait vPMot...
     
     vPVers := AllocMem(vLen);
     URLDecodeUTF8(PAnsiChar(vEntree), vPMot, vLen);
     
    // pourquoi ?!
     vMot := vPMot;
     ....   
     for k := vCurseur to vLen do
          vMot[k] := vMot[k+1];
     dec(vLen);
     ...
     
    // tu libères donc vPMot alors que tu dis l'utiliser dans un TList...
     FreeMem(vPVers);
    end;
    Bref, au risque de me répéter ton code est incompréhensible

    pourquoi n'utilises-tu pas simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     vMot := UTF8Decode(vEntree);
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Il y a aussi cette boucle sur vLen qui devrait être remplacé par Length(vMot) -1. vLen est 2x trop grand par rapport à la longueur de la chaîne

    A noter que l'ensemble de cette boucle pourrait être remplacé par MoveMemory.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/05/2014, 08h12
  2. Problème de libération de la mémoire dans une fonction
    Par ArnaudFu1 dans le forum Débuter
    Réponses: 2
    Dernier message: 23/02/2012, 16h21
  3. Libération mémoire dans une CMap
    Par BigzYeah dans le forum MFC
    Réponses: 0
    Dernier message: 19/01/2011, 17h01
  4. Libération de mémoire d'une cvMat
    Par Totocariolet dans le forum OpenCV
    Réponses: 8
    Dernier message: 07/05/2010, 15h09
  5. problème libération mémoire après une DLL
    Par salseropom dans le forum C
    Réponses: 22
    Dernier message: 03/09/2008, 12h51

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