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 :
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
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
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;
}
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 ?