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 :

[TList] Double référencement


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 [TList] Double référencement
    Salut à tous

    Je me pose cette question:

    Je crée une TList qui contient des pointeurs sur des variables. J'en crée une autre qui contient les pointeurs de quelques unes de ces variables.

    Si je fais un Clear sur la première TList, est-ce nécessaire de le faire aussi sur l'autre? Parce que normalement, avec clear, les pointeurs ainsi que les variables sur lesquelles ils pointent sont libérées.

    Exemple:
    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
     
    var i:integer;
          p:^integer;
          List1,List2:TList;
    begin
      List1:=TList.Create;
      List2:=TList.Create;
      for i:=0 to 100 do
      begin
        new(p);
        p^:=i;
        List1.Add(p); //Ajouter chaque valeur de i
        if (i mod 2)=0 then List2.Add(p);  // Si i est pair, l'ajouter dans List2
      end;
      List1.Clear;
      List2.Clear;
      List1.Free;
      List2.Free;
    end;
    Dans cet exemple, List1.Clear efface tous les pointeurs et ce qu'ils contienent... Mais si je fais List2.Clear juste après, List2 va resupprimer les objets non?
    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

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    pas vraiment.....

    à chaque New(p), tu alloues (=réserves) une adresse mémoire pour contenir ton integer.
    Ensuite, que tu stockes l'adresse de p dans 1 Tlist, ou 2 Tlist, ou 1 fichier, c'est complètement disjoint: si tu supprimes ton fichier, ça ne libère pas la RAM, Idem pour les TList.

  3. #3
    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
    Attention, tu confonds 2 choses :
    Un pointeur est un entier contenant une adresse (une valeur numérique).
    New alloue un espace mémoire permettant de stocker une variable du type pointé et inscrit l'adresse de cette zone mémoire dans le pointeur.

    Donc, si tu utilise New pour insérer des données dans un TList, il est impératif de libérer la mémoire allouée par un Dispose sur ces mêmes pointeurs avant d'effacer la liste. Sinon, tu vas effacer les pointeurs, mais pas les zones mémoires pointées.

    Je ne sais pas si je suis très clair là...

  4. #4
    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
    Ok d'accord... Mais dans le cas des TObjectList, dit que toute la gestion de libération mémoire est implementée dans Clear... Donc dans ce cas là, ce n'est pas la peine de faire ObjectList1[i].Free ?
    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

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 56
    Par défaut
    Exact, un TList est une liste de pointeur, TObjectListe, une liste d'objets.
    Tu peut donc créer la TObjectListe, avec Owned ) True, pour que la liberation de la liste libere les objets. Par contre il me semble dangereux d'avoir 2 liste d'objets qui contienne les mêmes objet, car à la libération de la premiere liste ca fonctionne bien, mais ta deuxieme liste aura des objets qui n'existe plus, en liberant le liste tu risque d'avoir des violations d'acces.

  6. #6
    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
    OK et merci

    Pour la libération, il n'y aura pas de problème puisque elles se font l'une après l'autre dans le Destroy de la fiche... Il faut juste les faire dans le bon ordre!
    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

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

Discussions similaires

  1. Problème référencement en double !?!
    Par steelidol dans le forum Référencement
    Réponses: 4
    Dernier message: 01/04/2009, 20h27
  2. [TList]: trier des doubles
    Par PpPool dans le forum Langage
    Réponses: 6
    Dernier message: 11/08/2005, 11h34
  3. Transtyper element d'1 variable pointant sur TList?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2003, 22h53
  4. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

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