OVH Cloud OVH Cloud

Gestion mémoire et new CWnd

64 réponses
Avatar
JM
J'ai une question surement très conne et simpliste (y'a bien longtemps
que je code plus en assembleur, passer du motorola 68000 aux intels,
merci, j'ai essayé et cela ne m'a pas convaincu).

Voila, lorsque je crée une fenêtre avec un truc du genre :
CWnd *pWnd=new CWnd

Puis je fais joujou avec cette fenêtre et je la ferme.
Lors de la cloture, j'ai cru comprendre que la routine de base
DestroyWindow faisait elle même un delete this, donc j'en conclue que je
ne suis pas obligé de le faire moi-même.

J'ai tout bon ou tout faux?

Merci d'avance

10 réponses

1 2 3 4 5
Avatar
Arnold McDonald \(AMcD\)
JM wrote:
J'ai une question surement très conne et simpliste (y'a bien longtemps
que je code plus en assembleur, passer du motorola 68000 aux intels,
merci, j'ai essayé et cela ne m'a pas convaincu).



Bizarre, vu le gouffre de puissance netre un Intel et un Motorola...

Voila, lorsque je crée une fenêtre avec un truc du genre :
CWnd *pWnd=new CWnd



Oui, jusque là c'est bon.

Puis je fais joujou avec cette fenêtre et je la ferme.
Lors de la cloture, j'ai cru comprendre que la routine de base
DestroyWindow faisait elle même un delete this, donc j'en conclue que
je ne suis pas obligé de le faire moi-même.



Vu le CWnd, je suppute que tu utilises les MFCs. La doc te dit :

"The MFC framework manages window destruction as well as creation for those
windows associated with framework documents and views. If you create
additional windows, you are responsible for destroying them."

Donc... tout dépend du type de ta fenêtre, additionnelle ou pas ? Sinon
CWnd::~CWnd appelle DestroyWindow tout seul, t'as pas à le faire.

Un truc bien à lire :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfcnotes_tn017.asp

PS : quel rapport avec ta question et l'assembleur ???

--
Arnold McDonald (AMcD) - Help #32/2006
http://arnold.mcdonald.free.fr/
Avatar
JM
Arnold McDonald (AMcD) a écrit :

Bizarre, vu le gouffre de puissance netre un Intel et un Motorola...



Puissance, peut-être, mais facilité d'utilisation et de programmation,
le 68000 était fabuleux!


Voila, lorsque je crée une fenêtre avec un truc du genre :
CWnd *pWnd=new CWnd




Oui, jusque là c'est bon.





Vu le CWnd, je suppute que tu utilises les MFCs. La doc te dit :

"The MFC framework manages window destruction as well as creation for those
windows associated with framework documents and views. If you create
additional windows, you are responsible for destroying them."

Donc... tout dépend du type de ta fenêtre, additionnelle ou pas ? Sinon
CWnd::~CWnd appelle DestroyWindow tout seul, t'as pas à le faire.



C'est une fenêtre crée en mode WS_POPUP

Un truc bien à lire :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfcnotes_tn017.asp



En fait, ce que je ne comprends pas trop, c'est si lors de l'appel de
DestroyWindow, il y a automatiquement un delete this (ou équivalent).
C'est pas hyper clair (enfin pour moi), dans la doc et le lien du dessus.

PS : quel rapport avec ta question et l'assembleur ???



Je ne sais plus trop, mais dans la longue discussion "fuites mémoires",
cela a dérivé entre des propos sur des questions "stupides" sur la
gestion mémoire et le fait qu'en France on codait plus en assembleur ou
un truc dans le genre :-)
Avatar
Bertrand Lenoir-Welter
JM :

CWnd *pWnd=new CWnd
Puis je fais joujou avec cette fenêtre et je la ferme.
Lors de la cloture, j'ai cru comprendre que la routine de base
DestroyWindow faisait elle même un delete this, donc j'en conclue que je
ne suis pas obligé de le faire moi-même.



Avec MFC, je sais pas. Mais chez Borland, même si ta fenêtre n'existe
plus, elle est toujours allouée et c'est à toi de faire un delete.

Etant plutôt du genre expérimentateur, j'aurais tendance à faire le
delete et voir si ça fait badaboum. Parce que dans le cas inverse, il se
passera rien mais t'en sauras pas plus.
Avatar
JM
Bertrand Lenoir-Welter a écrit :

Etant plutôt du genre expérimentateur, j'aurais tendance à faire le
delete et voir si ça fait badaboum. Parce que dans le cas inverse, il se
passera rien mais t'en sauras pas plus.



Effectivement : un delete avant le DestroyWindow, cela marche.
Le delete après le DestroyWindow, cela plante.

Merci
Avatar
Bertrand Lenoir-Welter
JM :

Effectivement : un delete avant le DestroyWindow, cela marche.
Le delete après le DestroyWindow, cela plante.



Il me viendrait pas à l'idée de désallouer AVANT d'appeler
DestroyWindow, sauf si l'appel est implicite. Et si le delete plante
après, c'est sans doute que la désallocation a été faite. Donc pas de
delete du tout, à mon avis.

Au passage, c'est curieux que DestroyWindow fasse un delete. Imaginons
que, pour une raison sotte et grenue, on ait envie de recréer la
fenêtre, ça veut dire qu'il faut réallouer le pointeur même si l'on na
pas désalloué. Je verrais assez bien DestroyWindow appelée
automatiquement par le delete, mais l'inverse me chiffonne un peu.
Avatar
Cyrille Szymanski
Bertrand Lenoir-Welter <bertrand-dot-2006-at-galaad-dot-net> wrote in
news:4450c726$0$29180$:

JM :

CWnd *pWnd=new CWnd
Puis je fais joujou avec cette fenêtre et je la ferme.
Lors de la cloture, j'ai cru comprendre que la routine de base
DestroyWindow faisait elle même un delete this, donc j'en conclue que
je ne suis pas obligé de le faire moi-même.



Avec MFC, je sais pas. Mais chez Borland, même si ta fenêtre n'existe
plus, elle est toujours allouée et c'est à toi de faire un delete.



Les MFC sont notoires pour ne pas être RAII (parfois si, parfois non, comme
l'explique AMcD).

--
Cyrille Szymanski
Avatar
Arnold McDonald \(AMcD\)
Cyrille Szymanski wrote:

Les MFC sont notoires pour ne pas être RAII



T'aurais pu détailler RAII :-) :

http://www.hackcraft.net/raii/
http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
http://www.codeproject.com/managedcpp/managedraii.asp

--
Arnold McDonald (AMcD) - Help #33/2006

http://arnold.mcdonald.free.fr/
Avatar
Arnold McDonald \(AMcD\)
JM wrote:

Puissance, peut-être, mais facilité d'utilisation et de programmation,
le 68000 était fabuleux!



C'est clair, il n'y avait pas photo. J'ai débuté dessus (snif, séquence
nostalgie). Après, quand je suis passé sur Intel et ses 127.256,5 modèles
mémoire, j'ai pleuré ma mère. Mais bon, depuis que je sais que l'Itanium
sera un échec définitif, je reste chez Intel :-).

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
JM
Arnold McDonald (AMcD) a écrit :

C'est clair, il n'y avait pas photo. J'ai débuté dessus (snif, séquence
nostalgie). Après, quand je suis passé sur Intel et ses 127.256,5 modèles
mémoire, j'ai pleuré ma mère. Mais bon, depuis que je sais que l'Itanium
sera un échec définitif, je reste chez Intel :-).



Atari vaincra!
Avatar
JM
Bertrand Lenoir-Welter a écrit :
Il me viendrait pas à l'idée de désallouer AVANT d'appeler
DestroyWindow, sauf si l'appel est implicite. Et si le delete plante
après, c'est sans doute que la désallocation a été faite. Donc pas de
delete du tout, à mon avis.



Ce que je voulais dire, c'est que si je fais le delete avant
destroywindow, il marche normalement (heureusement), c'était juste pour
vérifier!
Le fait qu'il plante après le destroywindow (j'ai appliqué le
testé-compris comme conseillé), montre juste que le destroywindow
désalloue tout seul

Au passage, c'est curieux que DestroyWindow fasse un delete. Imaginons
que, pour une raison sotte et grenue, on ait envie de recréer la
fenêtre, ça veut dire qu'il faut réallouer le pointeur même si l'on na
pas désalloué. Je verrais assez bien DestroyWindow appelée
automatiquement par le delete, mais l'inverse me chiffonne un peu.



A priori, en regardant les sources MFC, il semblerait que l'appel soit
fait dans le destructeur.
Mais dans le lien donné par AMCD, microsoft à l'air de conseiller
d'éviter d'utiliser delete
1 2 3 4 5