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 :

[DELPHI 5] Libérer une structure quand on a son pointeur


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut [DELPHI 5] Libérer une structure quand on a son pointeur
    Bonjour,

    En Delphi , j'utilise un objet TVirtualStringtree
    pour stocker des éléments dans un arbre.

    À chaque élément Node : PVirtualNode de mon arbre, j'associe une structure complémentaire
    que j'ai créée dynamiquement lors de la création de chaque Node grâce à la propriété Data.

    voici un résumé de mon code pour être plus clair :

    ...
    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
     
    type
    TTreeDataGeneral = record
      type_node : integer; 
     
      Father : TTreeDataFather;
      Child : TTreeDataChild;
     
      Modified : boolean;
      Text: string;
      ImageIndex: Integer;
      ...
    end;
     
    PTreeDataGeneral = ^TTreeDataGeneral;
     
     
    procedure TfmMessages.creation_node_pere(Q : TZIbSqlQuery);
    var
      NodeData: PTreeDataGeneral;
      Nodepapa: PVirtualNode;
     
    begin
      // create tree
      // je reserve la place necessaire pour chaque node, on utilise la taille de la structure déclaré TTreeData
      Tree_messages.NodeDataSize := SizeOf(TTreeDataGeneral);
      // initialise un node
      Nodepapa := Tree_messages.AddChild(nil);
      // récupère l'adresse de data
      NodeData := Tree_messages.GetNodeData(NodePapa);
     
    ...
     
    end;


    Mon problème : depuis quelque temps, le nombre de données affiché dans l'arbre a considérablement augmenté et
    après plusieurs heures d'utilisation du logiciel ( plusieurs chargements de l'arbre), une erreur "mémoire insuffisante" s'affiche.

    Le logiciel monte à 60 mo d'espace ram.

    Je pensais que lorsque de détruisait l'arbre ou la fenêtre de l'arbre, un free était fait sur mes structures.


    Comment faire pour libérer une structure quand on a son pointeur ? Merci.

  2. #2
    Membre émérite
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Par défaut
    Si la structure a bien été crée avec la fonction New, il te suffit d'appeler Dispose pour la libérer.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Utilises New et Dispose.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Ta Structure contient des String, ...
    deplus Father et Child, ce sont des structures ou des objets, dans le second cas, il te faudra les libérer si tu les a crée

    de plus, le Dispose pour correctement fonctionner doit connaitre le type du pointeur pour effectuer un finalize de la structure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dispose(PTreeDataGeneral((Node.Data));
    voir aussi, exactement la même demande !
    http://www.developpez.net/forums/sho...hlight=dispose

    Je faisais cela surtout pour la compréhension du code, et j'avais remarqué une baisse mémoire dans certains cas (j'ai la plupart du temps banni les string des record géré en pointeur au profit de array of char) et finalement c'est très important de précisé ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par ShaiLeTroll
    de plus, le Dispose pour correctement fonctionner doit connaitre le type du pointeur pour effectuer un finalize de la structure.
    T'es sûr de ce que tu avances là?

    Parce que si je fais:
    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 t: TList;
         Index: integer;
     
    procedure Debut;
    i: ^integer;
    begin
      t := TList.Create;
      New(i);
      i^ := 5;
      Index := t.Add(i);
    end;
     
    procedure Fin;
    begin
      Dispose(t.Items[Index]);
      t.Delete(Index);
    end;
    Je n'ai pas besoin de savoir si ce que contient Items[i] est du type integer ou TBiduleChouette
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    regarde en ASM (fenêtre CPU), Dispose doit en théorie être remplacé par FreeMem, ...

    la mémoire allouée est 4o pour l'entier, dispose connait dans sa table mémoire que le pointeur a alloué 4o donc il libère ...

    tu remplace ton entier par une chaine, dispose connait dans sa table mémoire que le pointeur a alloué 4o donc il libère le pointeur sur la chaine, mais le tableau associé à la chaine est toujours là, en précisant le type, il effectuera un finalize (fait F1 sur cette fonction)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 62
    Par défaut
    Merci beaucoup pour votre aide. Grâce à cela, mon problème est résolu

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

Discussions similaires

  1. [dll] libérer une dll apres utilisation
    Par polo54 dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 11/07/2009, 22h48
  2. Traduction en Delphi d'une structure
    Par skywaukers dans le forum Delphi
    Réponses: 6
    Dernier message: 14/06/2007, 00h07
  3. equivalent d'une structure en delphi
    Par pdgnr dans le forum Delphi
    Réponses: 7
    Dernier message: 19/09/2006, 14h16
  4. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    Réponses: 15
    Dernier message: 23/04/2003, 15h47
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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