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 :

Liste d'objets et retour d'une instance


Sujet :

Langage Delphi

  1. #1
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 950
    Points
    1 950
    Par défaut Liste d'objets et retour d'une instance
    Bonjour,

    J'ai une fonction d'une unité qui renvoie une instance sur un objet d'une liste créée localement
    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
     
     
    TMaListe = class(TObjectList)  
    ...    
    end;
     
    Function Unit.RenvoieObjet : TMonObject;
    var Liste : TMaListe;
        ObjetTrouve : Integer;
    begin
       Liste := TMaListe.create;
       ...
       Result := Liste.items[ObjetTrouve];
       ...
    end;
    Le problème est que je ne peux pas libérer la liste créée localement vu que cette fonction renvoie une instance sur un objet de cette liste pour être utilisée par la suite et donc fuite mémoire, comment résoudre ce problème élégamment ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Tu peux utilise Extract pour retirer un objet d'une liste sans le libérer mais ce n'est pas très performant comme opération dans une TObjectList car Extract fait un Find de l'instance
    Mais l'affection à nil fonctionne aussi en jouant sur OwnObjects ... je l'ai dans un code assez récent, cela fonctionne TObjectList<> en tout cas .

    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 Unit.RenvoieObjet : TMonObject;
    var
       Liste : TMaListe;
       O: TObject;
        ObjetTrouve : Integer;
    begin
       Liste := TMaListe.create(False);
       try
         Result := Liste.items[ObjetTrouve];
         Liste.items[ObjetTrouve] := nil; 
       finally
         Liste.OwnsObjects := True;
     
         Liste.Free();
       end;
    end;

    Donc OwnObjects à False si la liste n'est plus utile et une gestion manuelle de la libération hors de l'instance obtenue.
    Autre approche que l'affectation à nil

    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
    Function Unit.RenvoieObjet : TMonObject;
    var
       Liste : TMaListe;
       O: TObject;
        ObjetTrouve : Integer;
    begin
       Liste := TMaListe.create(False);
       try
         Result := Liste.items[ObjetTrouve];
       finally
         for o in Liste do
           if o <> Result
             o.Free(); 
     
         Liste.Free();
       end;
    end;
    Soit la liste est requise plus tard, tu peux faire un Singleton de TMaListe

    tu poser oser ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TMaListe = class(TObjectList)  
    strict private
      class var FInstance: TMaListe;
    public
      class property Singleton: GetInstance(): TMaListe 
      class function GetInstance(): TMaListe;
      class destructor Destroy();
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class function TMaListe.GetInstance(): TMaListe;
    begin
      if not Assigned(FInstance) then
        FInstance := TMaListe.Create();
     
      Result := FInstance;
    end;
     
    class destructor TMaListe.Destroy();
    begin
      FreeAndNil(FInstance);
    end;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function Unit.RenvoieObjet : TMonObject;
    var
        ObjetTrouve : Integer;
    begin
         Result := TMaListe.Singleton.items[ObjetTrouve];
    end;

  3. #3
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 614
    Points
    3 614
    Par défaut
    Par défaut le TObjectList prend la main sur les objets qu'on lui associé. Tu peux changer ça en modifiant ses paramètres ou tout simplement en utilisant un TList qui ne s'occupera pas d'allocation mémoire pour les éléments que tu lui fournis.

    Par contre, dans ce cas, ce sera à toi de faire le ménage lors de la suppression de la liste si tu ne l'as pas fait ailleurs pour tous les éléments qu'elle contient.

  4. #4
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 950
    Points
    1 950
    Par défaut
    Bonjour

    Et merci pour votre aide.

    Finalement j'ai fait en sorte de ne pas avoir besoin d'utiliser cette liste et c'est tant mieux, entre nous soit dit, utiliser une liste pour charger un objet, c'est un peu couillon

    Je mets en résolu.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par free07 Voir le message
    ...utiliser une liste pour charger un objet, c'est un peu couillon
    Si l'on obtient qu'un seul objet à chaque fois, oui !
    Si c'était le résultat d'une recherche, un peu con de ne prendre qu'un seul.

    Perso, dans le code que j'évoque où j'avais une TObjectList<> que je dépossédais de ses objets, c'était pour tous les mettres dans une TListView qui prenait la charge des objets par la suite, comme des Vases communicants, on ne sait jamais, la boucle sur 5000 éléments peut planter (trop de handles pour ajouter dans la TListview), alors tout ce qui n'a pas été transférés au TListView en responsabilité restaient à la charge de la TObjectList... qui devait les libérer quand même.

  6. #6
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 950
    Points
    1 950
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Si l'on obtient qu'un seul objet à chaque fois, oui !
    Si c'était le résultat d'une recherche, un peu con de ne prendre qu'un seul.
    Oui, c'est le cas ! C'est juste pour ne prendre qu'un seul objet, la liste n'est pas utilisée par ailleurs.

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

Discussions similaires

  1. [Débutant] Filtrer une liste d'objet en fonction d'une autre liste
    Par shaun_the_sheep dans le forum C#
    Réponses: 3
    Dernier message: 26/09/2013, 11h12
  2. Réponses: 2
    Dernier message: 22/08/2013, 14h58
  3. Objet non definie a une instance d'un objet
    Par andy331 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/03/2010, 19h14
  4. Réponses: 5
    Dernier message: 22/02/2009, 18h44
  5. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11

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