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