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 :

garbage collector delphi


Sujet :

Delphi

  1. #1
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut garbage collector delphi
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    var
    hd : tform1;
    begin
     hd := tform1.Create(nil);
     hd.Show;
    end;
    Est ce quand je ferme mon programme la var hd est détruite automatiquement ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Non, il lui faudrait un propriétaire.

  3. #3
    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
    il n'y a pas de garbage collector dans Delphi

    MAIS, les string, tableaux dynamiques et les interfaces subissent un traitement spécifique automatique.

    les méthodes addRef et Release des interfaces sont appelées automatiquement selon le besoin....un principe similaire est utilisé pour les string et les tableaux dynamique.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    A noter tout de même que sous Windows Seven, la mémoire est entièrement désallouée à la fin du processus.

  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
    Citation Envoyé par Andnotor Voir le message
    A noter tout de même que sous Windows Seven, la mémoire est entièrement désallouée à la fin du processus.
    chouette on va pouvoir coder comme des porcs !
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Non, il lui faudrait un propriétaire.
    il faut faire quelque chose du genre ?


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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hd := TForm1.Create(Application);

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    chouette on va pouvoir coder comme des porcs !
    Pour des applications à courte durée de vie; oui

  9. #9
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hd := TForm1.Create(Application);
    et FreeAndNil(hd ); ça fait le même effet non ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    En matière de libération, oui, mais avec une ligne de code supplémentaire.
    Il faudrait aussi que ta variable soit globale et non locale à la procédure.

  11. #11
    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
    Citation Envoyé par Jcpan Voir le message
    et FreeAndNil(hd ); ça fait le même effet non ?
    une fiche se libère par hd.Release;

    ceci dit, lui coller un owner t'évite d'avoir à coller sa libération quelque part.

    D'ailleurs ta variable "hd" étant locale, elle n'est plus accessible par la suite...ta fiche est dans la nature.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par Jcpan Voir le message
    Est ce quand je ferme mon programme la var hd est détruite automatiquement ?
    Techniquement parlant, la variable hd n'est rien d'autre qu'un pointeur.
    C'est une variable locale, donc elle est créée sur la pile. Elle sera détruite automatiquement quoi que tu fasses lorsque la méthode Button1Click rendra la main.

    En revanche, l'instance de la fiche créée par TForm1.Create et pointée par la variable hd ne sera pas détruite automatiquement.
    Il faudra faire un Free, soit directement, soit indirectement :
    - En faisant un Free ou un FreeAndNil : La fiche est alors détruite immédiatement. Par contre, il ne faut pas que la fiche se détruise elle-même (par exemple, suite à un clic sur un de ses boutons) sinon s'est l'access violation garanti.
    - En faisant un Release : La fiche va poster un message Windows à l'application pour demander sa destruction. La fiche sera ensuite effectivement détruite au moment où le message sera traité (Lors d'un ProcessMessages, juste avant que l'application redevienne Idle). Attention, Release permet à une fiche de se détruire elle-même, en revanche on ne maîtrise pas le moment où elle sera effectivement détruite. Si on implémente un traitement batch du genre un automate qui enchaîne l'exécution de plusieurs fiches, l'application ne traitent pas les messages windows tant que l'automate n'a pas terminé son travail, et les fiches créées ne sont détruites qu'à la fin...
    - en lui définissant un Owner au moment de sa création : L'instance sera détruite lorsque le Owner sera lui même détruit.

    A noter tout de même que sous Windows Seven, la mémoire est entièrement désallouée à la fin du processus.
    Pas que sous Seven. Sous windows (au moins depuis Win 2000), la mémoire est virtualisée.
    Lorsqu'un processus est créé, windows lui associe un espace d'adressage virtuel. Allouer de la mémoire pour le processus consiste en réalité à mapper un peu de mémoire sur l'espace d'adressage du processus.
    Lorsque le processus est détruit, son espace d'adressage aussi, ce qui a pour effet de libérer intégralement la mémoire qui lui était associée.

    Citation Envoyé par Andnotor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hd := TForm1.Create(Application);
    Certes, de cette façon la fiche sera détruite au moment de la fermeture de l'application, ce qui permettra de faire en sorte que le destructeur soit appeler. Mais ça n'a de sens que si la fiche doit resté ouverte pendant toute la durée de vie de l'application.

    Si on dit qu'il faut libérer la mémoire qu'on utilise (qu'il faut faire les Free), c'est pour qu'elle soit libérée dès qu'on a fini de s'en servir, pour qu'elle puisse être réutilisée pour autre chose au plus tôt.
    Si on met l'application comme Owner, la fiche ne sera détruite qu'à la sortie de l'application. Ca ne sert généralement pas à grand chose, puisque de toute façon, la mémoire sera libérée au moment de la destruction du processus.
    La fiche ne sera pas détruite dès qu'on n'en a plus besoin et elle continuera à consommer de la mémoire pour rien...
    C'est exactement la définition d'une fuite mémoire... Sauf que dans ce cas, techniquement parlant ça n'en est pas une puisque la fiche est toujours utilisée par l'application.
    Donc les outils qui font la chasse aux memory leak ne pourront pas détecter ce genre d'anomalies...

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    A noter tout de même que sous Windows Seven, la mémoire est entièrement désallouée à la fin du processus.
    Heuuu c'est pas la meme chose sur les autres versions ?
    Il me semble que sous XP c'est le cas, et que toutes les versions de windows suppriment ce qui a été alloué par un process quand il se termine !

    Edit: Mince, un temps de retard la dessus
    A noter tout de meme que le destroy n'est pas appelé si on ne gere pas nous meme la destruction de l'objet (ou à un owner / parent), ce qui peut etre genant si par exemple on sauvegarde des parametres à la destruction.

  14. #14
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Heuuu c'est pas la meme chose sur les autres versions ?
    Il me semble que sous XP c'est le cas, et que toutes les versions de windows suppriment ce qui a été alloué par un process quand il se termine !
    Et ca fonctionne parfaitement bien ? Ca n'oublie jamais rien ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Pas que sous Seven...
    Je me référais à cet article qui semblait ne concerner que Windows 7 et 2008 R2. Je me trompe certainement

    Citation Envoyé par Franck SORIANO Voir le message
    Certes, de cette façon la fiche sera détruite au moment de la fermeture de l'application, ce qui permettra de faire en sorte que le destructeur soit appeler. Mais ça n'a de sens que si la fiche doit resté ouverte pendant toute la durée de vie de l'application.
    Je ne dis pas que c'est la meilleure technique, mais c'est ce qui se rapprochait le plus (et le plus simple à mettre en oeuvre) de la question : Garbage collector à la fermeture du programme .

  16. #16
    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
    Citation Envoyé par Andnotor Voir le message
    Je me référais à cet article qui semblait ne concerner que Windows 7 et 2008 R2. Je me trompe certainement



    Je ne dis pas que c'est la meilleure technique, mais c'est ce qui se rapprochait le plus (et le plus simple à mettre en oeuvre) de la question : Garbage collector à la fermeture du programme .
    je pense que c'est vrai depuis les débuts de Windows

    à une exception près, les objets globaux évidemment (mutex, globalalloc...)

    c'est d'ailleurs une des raisons du choix de modèle multiprocess (et non multithread) de Google Chrome
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  17. #17
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    var
    hd : tform1;
    begin
     hd := tform1.Create(nil);
     hd.Show;
    end;
    moi ce qui m'inquiète c'est la création d'une TForm1 dans TForm1 ... je n'en saisie pas la logique et j'ai plutôt l'impression d'un n'importe quoi.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  18. #18
    Membre confirmé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Points : 475
    Points
    475
    Par défaut
    oui le code c'est du n'importe quoi, mais il visait la question derrière.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ...à une exception près, les objets globaux évidemment (mutex, globalalloc...)
    La gestion des mutex est encore différente puisque là, c'est definitly l'OS qui s'en charge. Ils seront de toute façon libérés si plus utilisés .

  20. #20
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Je me référais à cet article qui semblait ne concerner que Windows 7 et 2008 R2. Je me trompe certainement
    L'article est globalement écrit pour Windows 7 et 2008 R2, mais tout ne concerne pas que Windows 7 et 2008 R2.

    Merci pour le lien , il y a un certain nombre d'outils que je ne connaissais pas ! (et malheureusement, je pense que je vais bientôt en avoir besoin...)

Discussions similaires

  1. le Garbage Collector de delphi
    Par helmis dans le forum Langage
    Réponses: 6
    Dernier message: 21/11/2008, 21h07
  2. [JVM]Garbage collector
    Par godik dans le forum Général Java
    Réponses: 5
    Dernier message: 07/10/2005, 09h12
  3. JPanel et Garbage Collector
    Par tck-lt dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 25/07/2005, 18h03
  4. [JVM] les objets et le Garbage collector
    Par Kurdran dans le forum Général Java
    Réponses: 7
    Dernier message: 02/06/2005, 16h57
  5. [Language]Garbage collector
    Par GETah dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2005, 15h18

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