Bonjour,
j'ai une fuite de memoir dans la fonction suivante que j'arrive pas a repérer:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
UINT CIndexFicheView::LoadCurPage()
{
	CFileFind fileFind;
	BOOL bFound = fileFind.FindFile(strSourcePath);
	CPaintDC dc(this);
 
	if(PathFileExists(strCurFiche))
	{
		CString curFile = strCurFiche;
 
		FIMULTIBITMAP* multiBmp = FreeImage_OpenMultiBitmap(FIF_TIFF, curFile, FALSE, TRUE);
		//charger et rescaler l'image 
		FIBITMAP* pDIB = FreeImage_LockPage(multiBmp, m_nCurPage);
		FIBITMAP *pNewDIB = FreeImage_Rescale(pDIB, sizeCurPage.cx*1.63, sizeCurPage.cy*1.63, FILTER_LANCZOS3);
		FreeImage_UnlockPage(multiBmp, pNewDIB, false);
 
		//Afficher l'image
		BITMAPINFOHEADER *pBIH = FreeImage_GetInfoHeader(pNewDIB);
		BITMAPINFO *pBI = FreeImage_GetInfo(pNewDIB);
		HBITMAP hBitmap = CreateDIBitmap(dc.GetSafeHdc(),pBIH,CBM_INIT,FreeImage_GetBits(pNewDIB),pBI,DIB_RGB_COLORS);
		if(!hBitmap)
		{
			CString tmp;
			tmp.Format("%d", GetLastError());
			MessageBox(tmp);
		}
		m_picturePages.SetBitmap(hBitmap);
 
		FreeImage_Unload(pNewDIB);
 
		//page precedente
		if(m_nCurPage>0)
		{
			pDIB = FreeImage_LockPage(multiBmp, m_nCurPage-1);
			pNewDIB = FreeImage_Rescale(pDIB, sizePrevPage.cx*1.63, sizePrevPage.cy*1.63, FILTER_CATMULLROM);
			FreeImage_UnlockPage(multiBmp, pNewDIB, false);
 
			BITMAPINFOHEADER *pBIH = FreeImage_GetInfoHeader(pNewDIB);
			BITMAPINFO *pBI = FreeImage_GetInfo(pNewDIB);
			HBITMAP hBitmap = CreateDIBitmap(dc.GetSafeHdc(),pBIH,CBM_INIT,FreeImage_GetBits(pNewDIB),pBI,DIB_RGB_COLORS);
			if(!hBitmap)
			{
				CString tmp;
				tmp.Format("%d", GetLastError());
				MessageBox(tmp);
			}
			m_picturePrevPage.SetBitmap(hBitmap);
 
			FreeImage_Unload(pNewDIB);
		}
		else 
		{
			CBitmap errBitmap;
			errBitmap.LoadBitmapA(IDB_NO_PAGE);
			m_picturePrevPage.SetBitmap(errBitmap);
		}
 
 
		//page suivante
		if(m_nCurPage<FreeImage_GetPageCount(multiBmp)-1)
		{
			pDIB = FreeImage_LockPage(multiBmp, m_nCurPage+1);
			pNewDIB = FreeImage_Rescale(pDIB, sizeNextPage.cx*1.63, sizeNextPage.cy*1.63, FILTER_CATMULLROM);
			FreeImage_UnlockPage(multiBmp, pNewDIB, false);
 
			BITMAPINFOHEADER *pBIH = FreeImage_GetInfoHeader(pNewDIB);
			BITMAPINFO *pBI = FreeImage_GetInfo(pNewDIB);
			HBITMAP hBitmap = CreateDIBitmap(dc.GetSafeHdc(),pBIH,CBM_INIT,FreeImage_GetBits(pNewDIB),pBI,DIB_RGB_COLORS);
			if(!hBitmap)
			{
				CString tmp;
				tmp.Format("%d", GetLastError());
				MessageBox(tmp);
			}
			m_pictureNextPage.SetBitmap(hBitmap);
 
			FreeImage_Unload(pNewDIB);
		}
		else 
		{
			CBitmap errBitmap;
			errBitmap.LoadBitmapA(IDB_NO_PAGE);
			m_pictureNextPage.SetBitmap(errBitmap);
		}
 
		FreeImage_CloseMultiBitmap(multiBmp);
	}
	return 0;
}
Comme vous pouvez le constater, j'utilise dans mon code l'API FreeImage ouvrir un fichier multipage. Je fais appel a cette fonction au WM_PAINT pour afficher la page en cours (definie par son numero de page) et la page precedente et la page suivante, mais au bout d'un moment (a peu pres 50 affichages) les pages ne s'affichent pas et la lecture de la derniere erreur indique le code 8 : ERROR_NOT_ENOUGH_MEMORY, mais pourtant le gestionnaire des taches n'indique pas une hausse de consomation de memoir par mon application !
voilà vous savez tout.
merci pour votre aide