Bonjour tout le monde,
Bon j'ai un application qui commence a devenir assez grosse (~15000 lignes) en MFC sous VC++6.0. Depuis le d�but j'ai eu la gestion de la m�moire en priorit�. Et pourtant il persiste quelques memory leak dont un particuli�rement bizarre.
En fait au lancement mon appli charge un fichier en m�moire. Pour tester j'ai fais une simple dialog box avec un bouton pour charger le fichier et un pour d�sallouer tout ce que j'alloues au chargement du fichier.
Voil� un ptit trace de ce que me donne ctrl+alt+suppr en terme de m�moire utilis�e :
Bon que ca prenne 21Mo c'est tout � fait normal et c'est pas ca le prob. Le prob c'est que je charge un fichier dans un char*, et que quand je delete[] ce char* eh ben ca r�cup�re pas toute la m�moire. Bon je peux vous montrer un peu de code mais rien d'extraordinaire :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 2144 ko (déchargé) 21732 ko (chargé) 2372 ko (déchargé) ML : 228 ko 21748 ko (chargé) 2380 ko (déchargé) ML : 8 ko 21752 ko (chargé) 2384 ko (déchargé) ML : 4 ko 21752 ko (chargé) 2384 ko (déchargé) ML : 0 ko 21768 ko (chargé) 2400 ko (déchargé) ML : 16 ko 21776 ko (chargé) 2408 ko (déchargé) ML : 8 ko 21780 ko (chargé) 2412 ko (déchargé) ML : 4 ko 21780 ko (chargé) 2412 ko (déchargé) ML : 0 ko
Je code sous VC++ 6.0, d'o� peut venir le memory leak dans ce code ? (il n'y a que ce code qui est execut� quand j'appuie sur les 2 boutons). Je pr�cise que le trave est diff�rent a chaque execution mais on retrouve toujours cette sorte de "cycle" (16 - 8 - 4 - 0). Une id�e ?
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 void CMonApp::Load() { ifstream f; f.open(Path,ios::binary); if(!f.is_open()) { // gestion de l'erreur (code inutile dans le cadre de ce problème } LoadDialog *Load_dlg = new LoadDialog; Load_dlg->Create(IDD_LOAD,NULL); Load_dlg->ShowWindow(SW_SHOW); Load_dlg->UpdateWindow(); unsigned long len = theApp.File_GetSize(f); unsigned long pos = 0; Buffer = new char[len+1]; Buffer_Len = len; f.read(theApp.Buffer,len); f.close(); Load_dlg->DestroyWindow(); // Là j'utilise le début du Buffer et donc j'en ai plus besoin, je le désalloue partiellement via : Reloc(seek); } void CMonApp::Reloc(const int seek) { int new_size = Buffer_Len-seek; char * Temp_Buffer = new char[new_size+1]; memcpy(Temp_Buffer,Buffer+seek,new_size); delete[] Buffer; Buffer = new char[new_size+1]; memcpy(Buffer,Temp_Buffer,new_size); Buffer_Len = new_size; delete[] Temp_Buffer; } // Et voilà la fonction que j'utilise pour déchargé le tout de la mémoire : void CMonApp::UnLoad() { if(Buffer) { delete[] Buffer; } } // Par rapport au new fais dans la fonction Load et pour lequel il n'y a pas de delete il se trouve dans la classe : void LoadDialog::OnDestroy() { CDialog::OnClose(); delete this; }![]()
Partager