Savoir ou va la memoire...

Signaler
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007
-
Messages postés
25
Date d'inscription
vendredi 4 août 2006
Statut
Membre
Dernière intervention
23 mai 2007
-
    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

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
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);







}
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

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?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

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?
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008

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] @++
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

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?
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
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)
Messages postés
475
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
3 novembre 2008

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] @++
Messages postés
25
Date d'inscription
vendredi 4 août 2006
Statut
Membre
Dernière intervention
23 mai 2007

 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~!