Bonjour
Est ce quand je ferme mon programme la var hd est détruite automatiquement ?Code:
1
2
3
4
5
6
7 procedure TForm1.Button1Click(Sender: TObject); var hd : tform1; begin hd := tform1.Create(nil); hd.Show; end;
Version imprimable
Bonjour
Est ce quand je ferme mon programme la var hd est détruite automatiquement ?Code:
1
2
3
4
5
6
7 procedure TForm1.Button1Click(Sender: TObject); var hd : tform1; begin hd := tform1.Create(nil); hd.Show; end;
Non, il lui faudrait un propriétaire.
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.
A noter tout de même que sous Windows Seven, la mémoire est entièrement désallouée à la fin du processus.
Code:hd := TForm1.Create(Application);
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.
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.
Pas que sous Seven. Sous windows (au moins depuis Win 2000), la mémoire est virtualisée.Citation:
A noter tout de même que sous Windows Seven, la mémoire est entièrement désallouée à la fin du processus.
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.
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.Citation:
Envoyé par Andnotor
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...
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 :oops:
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.
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
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.Code:
1
2
3
4
5
6
7 procedure TForm1.Button1Click(Sender: TObject); var hd : tform1; begin hd := tform1.Create(nil); hd.Show; end;
oui le code c'est du n'importe quoi, mais il visait la question derrière.
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 :ccool:, 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...)