Savoir ou va la memoire...

jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007 - 4 déc. 2006 à 16:31
hibakusha Messages postés 25 Date d'inscription vendredi 4 août 2006 Statut Membre Dernière intervention 23 mai 2007 - 11 déc. 2006 à 14:33
    Bonjour,

J'aimerai comment savoir qu'est ce qui prend exactement la memoire dans mon programme!
Genre dans mon debug je vois a un moment (genre au niveau d'un breakpoint) que ma classe Truc contient 315 element et prend 2Mb de memoire....
Je sais qu'il y a:

if(diffMemState.Difference(oldMemState, newMemState))
    {
        TRACE( "Memory leak!\n");
        diffMemState.DumpAllObjectsSince();
    }

mais que pour les MFC et moi je travail sous visual C++ 6 win 32 sans MFC

Y a t il un moyen?

merci!

jojo

9 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
4 déc. 2006 à 17:12
Tu peux utiliser une fonction du genre dans un log :
(Lever les divisions (>> 20) pour avoir en octet et faire des stats précises)




// utilisation mem en pourcentage

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>










 







DWORD
GetUtilisationMemoire()








{








             MEMORYSTATUSEX statex;








            

ZeroMemory(&statex, 0);











             statex.dwLength =sizeof(MEMORYSTATUSEX);








             GlobalMemoryStatusEx(&statex);








            
DWORD dw;










            
// mémoire totale en Mo:










            
dw = (DWORD) ((statex.ullTotalPhys >> 20) + 1);










            
// mémoire disponible en Mo:










            
dw = (DWORD) ((statex.ullAvailPhys >> 20) + 1);










            
// mémoire utilisée en Mo:










            
dw = (DWORD) ((statex.ullTotalPhys - statex.ullAvailPhys) >> 20);










            
// pourcentage mem utilisée:










            
return
(statex.dwMemoryLoad);







}
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
4 déc. 2006 à 18:32
Et je dois inclure quoi pour que ca marche? parcke ca me met :

c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(24) : error C2065: 'MEMORYSTATUSEX' : undeclared identifier
c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(24) : error C2146: syntax error : missing ';' before identifier 'statex'
c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(24) : error C2065: 'statex' : undeclared identifier
c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(28) : error C2228: left of '.dwLength' must have class/struct/union type
c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(30) : error C2065: 'GlobalMemoryStatusEx' : undeclared identifier
c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(36) : error C2228: left of '.ullTotalPhys' must have class/struct/union type
c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(40) : error C2228: left of '.ullAvailPhys' must have class/struct/union type
c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(44) : error C2228: left of '.ullTotalPhys' must have class/struct/union type
c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(44) : error C2228: left of '.ullAvailPhys' must have class/struct/union type
c:\documents and settings\joh@n\mes documents\epfl\projet de semestre\3d_visu\gestionfichier.cpp(48) : error C2228: left of '.dwMemoryLoad' must have class/struct/union type

Ca me donnera vraiment les stat que je veux? a l endroit ou j appelerai la fonction ca me dira quel classe prend tant de memoire pour tout ce qui utilise de la memoire dans mon programme?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 déc. 2006 à 19:38
Tu veux trouver les fuites de mémoire, ou avoir combien de mémoire utilsie ton programme. Pour la 2e solution, tu peux utiliser le gestionnaire des taches

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
4 déc. 2006 à 19:50
Je vais essayer d etre le plus precis possible:
Je regarde sur  le gestionnaire des taches la memoire que mon prog utilise, mais certain truc m on l air bizzare, augmentation de la memoire annormale, ...
Alors j aimerai a un moment dans mon programme, pouvoir voir toute la memoire utilisé par mon programme et ou elle se situe, les valeurs, ...
comme ca je verrai si j ai mal deleté un element ou non.
Par exemple voir si ma class MyClass qui est un tableau d objets est deleté, ou combien d element elle comporte, et combien de place elle prend dans la memoire... j aimerai avoir une liste de tout ce qui prend de la memoire a un moment precis dans mon programme!

Vous voyez ce que je veux dire?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
5 déc. 2006 à 05:43
Tu vois des trucs bizarre dans le TaskManager! Il faut s'inquiéter généralement quand ton programme prend de plus en plus de mémoire et que c'est continuel.
Pour ce qui est de ton application, si c'est une application Windows, les chiffres sur le TaskManager ne veulent rien dire. Remarque qu'il suffit de réduire la fenêtre et la restaurer pour que ton application libère beaucoup de mémoire. En fait, pendant que l'utilisateur utilise ton application, Windows alloue de la mémoire pour des tâches de la GUI et ne la libère pas tout de suite. C'est ce que j'ai pu constater par expérience.

[:D] @++
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
5 déc. 2006 à 11:04
C'est vrai que reduire la fenetre et la restaurer libere de la memoire, mais je desire tout de meme savoir exactement ou se trouve ma memoire!
enfin precisement qu'est ce qui utilise ma memoire et combien elle utilise !
Y a un moyen?
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
5 déc. 2006 à 14:54
Pour tes erreurs de compil, je pense que tu n'as pas inclu <windows.h>, pour le reste, si a chaque allocation d'un objet de tes classes, tu insere un log dans le constructeur et le destructeur, tu verras dejà si certains objets produisent des copies non bénéfique, ou si ils ne sont pas détruit comme il faut.
Les fuites les plus courantes sont GDI (SelectObject() et deleteObject()) et partout ou tu as des new (ou malloc) sans delete (ou free)
et enfin les copies d'objets (constructeur par recopie)
0
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
5 déc. 2006 à 15:48
Oui, il y a la manière manuel de yann_lo_san mais pour faire automatique, à ma connaissance c'est presque impossible.
Même si tu peux avoir un hook sur les allocations et sur les libérations, tu ne seras pas en mesure de connaître le nom de la variable, ni même l'emplacement du code qui alloue. Avec le debugger de Windows (Platform SDK), y a moyen d'aller plus en profondeur mais même là, je peux rien dire (jamais essayé)
Bonne chance, ton problème est assez pointu

[:D] @++
0
hibakusha Messages postés 25 Date d'inscription vendredi 4 août 2006 Statut Membre Dernière intervention 23 mai 2007 1
11 déc. 2006 à 14:33
 A mi chemin entre la torture d'un debugger et la technique du "j'men fout quand j'arette l'exe Windows fait le menage plutot bien en general...", il y a un petit truc simple à faire : encapsule les appels à malloc/free new/delete (plus complexe ici) par tes propres fonctions de gestion de la memoire.

Dans celles ci tu trace des infos du genre nombre d'appel, taille demandé, adresses retournés, demande de liberation, etc... tout ce qui peut être utile... tu log ça dans un fichier texte et ça peut déja être un premier pas vers la/les réponse(s) que tu cherche.

Le truc super drole en C++ c'est que tu peut redefinir new et delete, si t'as rien a faire et que tu veut finir ta vie à coder la nuit juste pour le fun, alors fonce petit homme.

zNoRt~!
0
Rejoignez-nous