OVH Cloud OVH Cloud

Resource leak

4 réponses
Avatar
Jean-François GAZET
Bonjour,

j'ai une fuite mémoire an quittant mon programme sous VC++6.0 :

Resource leak: allocated by RegisterClassA in d:\tralala\pouet\main.cpp
(706), HANDLE: 0x0000C1F5

Le problème vient du code suivant inclus dans une fonction :
WNDCLASS wc;
...
RegisterClass(&wc)

Je pense que c'est à cause de la classe wc qui n'est pas détruite mais c'est
pourtant une variable locale à la fonction.

Est-ce qu'on doit faire quelque chose comme UnRegisterClass(&wc) ou
DeleteObject(wc) ? (mais bien sûr ceci ne marche pas).

Merci

4 réponses

Avatar
Vincent Burel
"Jean-François GAZET" wrote in message
news:bljd8k$8u1$
Bonjour,

j'ai une fuite mémoire an quittant mon programme sous VC++6.0 :

Resource leak: allocated by RegisterClassA in d:tralalapouetmain.cpp
(706), HANDLE: 0x0000C1F5

Le problème vient du code suivant inclus dans une fonction :
WNDCLASS wc;
...
RegisterClass(&wc)

Je pense que c'est à cause de la classe wc qui n'est pas détruite mais


c'est
pourtant une variable locale à la fonction.



c'est votre variable qui est locale, pas l'objet auquel elle s'attache. En
outre cette variable structurée ne représente pas la class mais les
paramètres de la création de cette classe. Si donc, vous avez demandé au
systeme de créer une classe, alors il faut lui demander de la détruire quand
vous n'en avez plus besoin.

Est-ce qu'on doit faire quelque chose comme UnRegisterClass(&wc) ou
DeleteObject(wc) ? (mais bien sûr ceci ne marche pas).



comme le montre le proto ci-dessous
BOOL UnregisterClass(
LPCTSTR lpClassName, // class name
HINSTANCE hInstance // handle to application instance
);

pour détuire une classe , il faut son nom et l'hinstance de l'application où
elle a été créée.
REM : il n'est pas nécessaire de faire un UnregisterClass pour la fenêtre
principale de l'application.

VB
Avatar
Jean-François GAZET
> > j'ai une fuite mémoire an quittant mon programme sous VC++6.0 :
> Resource leak: allocated by RegisterClassA in d:tralalapouetmain.cpp
> (706), HANDLE: 0x0000C1F5
> Le problème vient du code suivant inclus dans une fonction :
> WNDCLASS wc;
> ...
> RegisterClass(&wc)



comme le montre le proto ci-dessous
BOOL UnregisterClass(
LPCTSTR lpClassName, // class name
HINSTANCE hInstance // handle to application instance
);
pour détuire une classe , il faut son nom et l'hinstance de l'application



elle a été créée.
REM : il n'est pas nécessaire de faire un UnregisterClass pour la fenêtre
principale de l'application.



Pourtant j'ai bien le code suivant à la fermeture de la fenêtre :

if (!UnregisterClass("zOpenGL",hInstance)) {
MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK |
MB_ICONINFORMATION);
hInstance=NULL;
}

La fuite serait donc celle de la fenêtre principale ? c'est inévitable ?
Avatar
Mickael Pointier
> La fuite serait donc celle de la fenêtre principale ? c'est
inévitable ?



Problème de joint ?
Avec les ennuis de Valve, ca commence à en faire des fuites !

Mike (désolé)
Avatar
Frédéri MIAILLE
"Jean-François GAZET" a écrit dans le message de
news:bljm3f$jsp$
> > j'ai une fuite mémoire an quittant mon programme sous VC++6.0 :
> > Resource leak: allocated by RegisterClassA in


d:tralalapouetmain.cpp
> > (706), HANDLE: 0x0000C1F5
> > Le problème vient du code suivant inclus dans une fonction :
> > WNDCLASS wc;
> > ...
> > RegisterClass(&wc)

> comme le montre le proto ci-dessous
> BOOL UnregisterClass(
> LPCTSTR lpClassName, // class name
> HINSTANCE hInstance // handle to application instance
> );
> pour détuire une classe , il faut son nom et l'hinstance de


l'application

> elle a été créée.
> REM : il n'est pas nécessaire de faire un UnregisterClass pour la


fenêtre
> principale de l'application.

Pourtant j'ai bien le code suivant à la fermeture de la fenêtre :

if (!UnregisterClass("zOpenGL",hInstance)) {
MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK |
MB_ICONINFORMATION);
hInstance=NULL;
}

La fuite serait donc celle de la fenêtre principale ? c'est inévitable ?


Un truc bête :
J'ai eu ce genre de problème une fois (enfin sensiblement différent).
J'avais mon WndProc et son switch interne.
En default de switch, j'avais le DefaultWndProc qui gérait les choses non
gérées.
Seulement, problème, je ne renvoyais pas 0 dans certains case.
Notamment à mon ON_CLOSE ou ON_DESTROY. Total :
ON_CLOSE arrive, je détruit ma fenêtre mais je ne renvoie pas 0.
Alors un dernier passage dans le WndProc devait se produire et ma fenêtre
est déjà détruite mais le programme ordonne sa destruction en prenant le
default et donc le DefaultWndProc ce qui avait pour effet de détruire une
fenêtre déjà détruite.

--
Frédéri MIAILLE
fr.comp.lang.c
fr.comp.lang.c++
fr.comp.graphisme.programmation
fr.comp.os.ms-windows.programmation