[C++/MFC] pb avec la méthode DestroyWindow( )

pb avec la méthode DestroyWindow( ) [C++/MFC] - Programmation

Marsh Posté le 18-12-2001 à 14:29:52    

c très simple à expliquer:
j'utilise une boite de dialogue non modale.
Quand on crée la fenêtre, je vérifie si un Hwnd est déja associé à l'instance (unique) de la classe de ma boite de dlg non modale.
Si le Hwnd associé est NULL, il faut créer le fenêtre, je fais donc un Create sur l'instance. jusqu'ici, tout vas bien...
Dans ma classe de boite de dialogue non modale, je surcharge le OnClose (méthode appelée à la fermeture de la boite de dialogue), pour y faire un DestroyWindow() (essenciel, si je veux que le Hwnd de l'instance de la classe de ma boite de dialogue non modale soit remis à NULL).
Sachant ça, qqn saurai il pourquoi, après 3 ou 4 ouvertures puis fermetures de cette boite de dialogue (3 ou 4 appels de Create, puis de DestroyWindow), ça plante. Je peux juste dire que, Si l'appel de Create n'est pas fait pour la 1ère fois, j'ai des violation d'accès:
 
First-chance exception in ClipScan.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
 
j'en ai marre... c chiant ces petits pb qui font que ton appli n'est pas diffusable !

Reply

Marsh Posté le 18-12-2001 à 14:29:52   

Reply

Marsh Posté le 18-12-2001 à 19:53:24    

tu peux tester avec IsWindow() avant d'appeler destroy. quand tu dis surcharger, tu overrides ou overloades ? l'implémentation par défaut de onClose n'appelle pas DestroyWindow() ?

Reply

Marsh Posté le 19-12-2001 à 08:58:12    

Alors...
IsWindow, ça résoudra pas mon pb.
Je sais pas moi, si j'override ou si j'overload, c quoi la différence. Disons que ma classe hérite de CDialog. j'ai redéfini sa méthode OnClose, c ça que j'appel surcharger.
Et l'implémentation par défaut de OnClose à pas l'air d'appeler DestroyWindow, puisque elle ne met pas à NULL le hWnd du CWnd auquel j'applique le OnClose.
Quand j'exécute en débug, à la fin de l'execution, g ça dans l'output de VC++:
 
Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.
Detected memory leaks!
Dumping objects ->
strcore.cpp(118) : {614} normal block at 0x01426950, 87 bytes long.
 Data: <        J   2552> 01 00 00 00 12 00 00 00 4A 00 00 00 32 35 35 32  
strcore.cpp(118) : {613} normal block at 0x01424080, 37 bytes long.
 Data: <            Cr  > 01 00 00 00 18 00 00 00 18 00 00 00 43 72 E9 E9  
strcore.cpp(118) : {611} normal block at 0x014240E0, 68 bytes long.
 Data: <        7   Tail> 01 00 00 00 19 00 00 00 37 00  
......

Reply

Marsh Posté le 19-12-2001 à 09:19:14    

override = tu remplaces le code de la méthode par le tien
overload = tu rajoutes du code en plus de la méthode parent
 
class A
{
  virtual void myMethod();
};
 
class B : public A
{
  virtual void myMethod();
};
 
un override c'est :  
 
void B::myMethod()
{
  // le code de la méthode ...
}
 
un overload c'est :
 
void B::myMethod()
{
  // le code de la méthode ...
  // + l'appel à la méthode de la classe de base
  A::myMethod();
}  
 
je sais pas de quoi tu dérives, mais la classe de base appelle sûrement la windowproc.  
 
...
 
ce que tu vois dans l'output de visual en debug, ça s'appelle des memory leaks, et c'est trèèèèèèèèèèèèèèèèèèèès mal. c'est de la mémoire non libérée, donc ne t'étonne pas si ton programme ne marche pas correctement. f4 pour voir d'où ça vient.

Reply

Marsh Posté le 19-12-2001 à 09:22:34    

ce que je fais, c donc un overload (j'appel le OnClose de CDialog dans ma surchage de OnClose)...
F4 !? sous VC++ 6.0 ? à quel moment je fais F4 ? et ça va m'afficher quoi ?

Reply

Marsh Posté le 19-12-2001 à 09:24:51    

si je fais F4 au moment ou y m'affiche ça (qd je ferme mon appli), y me dit que le fichier strcore n'existe pas (ou plus)...

Reply

Marsh Posté le 19-12-2001 à 09:29:14    

f4 à la sortie, il ouvre le fichier correspondant à la bonne ligne ou se passe le memory leak.
 
si ça ne marche pas, essaye de gicler tous les fichiers temporaires et de faire un rebuild all ...

Reply

Marsh Posté le 19-12-2001 à 09:32:33    

le pb, c'est que lui me signale le débordement dans le fichier strcore.cpp. c truc là, ça fait pas partie de mon projet... donc il existe pas (ou plus qd je termine mon appli).

Reply

Marsh Posté le 19-12-2001 à 09:38:54    

strcore.cpp en fait, c un fichier utilisé par les MFC...

Reply

Marsh Posté le 19-12-2001 à 10:40:47    

apparement tu ne vides pas entierement la memoire alouée à ta boite de dialogue lors du OnClose. Le plantage pourrait venir de là.
 
Deux solutions :
- tu surcharges le delete de ta boite de dialogue en effacant les variables/pointeurs
- tu ne detruis pas ta boite de dialogue à chaque fois mais tu la crées une fois au demarrage et tu fais ShowWindow(SW_SHOW) / ShowWindow(SW_HIDE), pour l'afficher/la cacher
moi je m'y prend comme ca ..
 
apres ca depend de ton projet ..
 
:hello:

Reply

Marsh Posté le 19-12-2001 à 10:40:47   

Reply

Marsh Posté le 19-12-2001 à 11:36:49    

la viper a écrit a écrit :

apparement tu ne vides pas entierement la memoire alouée à ta boite de dialogue lors du OnClose. Le plantage pourrait venir de là.
 
Deux solutions :
- tu surcharges le delete de ta boite de dialogue en effacant les variables/pointeurs
- tu ne detruis pas ta boite de dialogue à chaque fois mais tu la crées une fois au demarrage et tu fais ShowWindow(SW_SHOW) / ShowWindow(SW_HIDE), pour l'afficher/la cacher
moi je m'y prend comme ca ..
 
apres ca depend de ton projet ..
 
:hello:  




 
Pour la surcharge du delete, je l'ai pas fait parce que logiquement, ma classe en a pas besoin, parce qu'elle ne contient aucun pointeur. Et les variables n'ont pas besoin de delete normalement, si !?
Et puis de tte façon, c sur que ça n'viens pas de la destruction de l'objet, puisque l'erreur apparait alors que je ne détruit pas l'objet, seulement la boite de dialogue (voir explication du pb de base au début du topic), ce qui n'appel de toute façon pas le destructeur.
Le fait de ne pas détruire la boite de dialogue, c'est aussi ce que je fais généralement, mais là, pr certaines raisons, je préfèrerai recréer la fenêtre à chaque fois. au pire, c surement possible de se débrouiller comme ça. Mais ça me frustre... g un peu l'impression de me faire matter par mon appli ! frustrant ! :gun:

Reply

Marsh Posté le 19-12-2001 à 12:03:52    

:lol:
 
and, the winner is ...
 
ben, c'est sur que c'est un peu chelou ton truc :(
mais là pour l'instant, j'ai rien qui me vient à l'esprit .. p'etre tout à l'heure.
 
:hello:

Reply

Marsh Posté le 19-12-2001 à 16:28:46    

Bon, je suis désolé, mais avec les éléments que je vous ai donné, c'était impossible de trouver d'ou ça venait. Faut dire que VC brouille les piste !:D en fait, le gros pb de "memory leaks", ça venait du fait que je remplissait un CMap à l'init de ma boite, et que je la vidais pas à la destruction ! forcément, au bout d'un moment, ça déborde  :D  
par contre y me met toujours ça
Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.
 
qui est donc complètement autre chose que mon débordement mémoire, et qui parait pas gènant.
Merci, et désolé de vous avoir fait réfléchir pour rien (quoi qu'on réfléchi jammais pour rien en fait !:D)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed