Bonjour,
j'ai des problèmes de memory leak après activation de sharemem.
Au début, le code qui pose problème était le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 function TCompoCustom.TBitmapToTGPBitmap(DBitmap:TBitmap):TGPBitmap; var stream:TMemoryStream; begin stream := TMemoryStream.Create; DBitmap.SaveToStream(stream); Result := TGPBitmap.Create(TStreamAdapter.Create(stream)); end;Ce code générait des memory leak, je l'ai donc modifié comme ceci:
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 TCompoCustom.paint; var OGraphics:TGPGraphics; tampon:TBitmap; begin tampon:=nil; .......... tampon:=TBItmap.create(); OGraphics:=TGPGraphics.Create(Canvas.Handle); OGraphics.SetSmoothingMode(SmoothingModeAntiAlias); OGraphics.SetCompositingQuality(QualityModeHigh); OGraphics.DrawImage(TBitmapToTGPBitmap(tampon),0,0); try if tampon<>nil then FreeAndNil(tampon); except end; try FreeAndNil(OGraphics); except end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 function TCompoCustom.TBitmapToTGPBitmap(DBitmap:TBitmap;stream:TMemoryStream;StreamAdapter:TStreamAdapter):TGPBitmap; begin stream := TMemoryStream.Create; DBitmap.SaveToStream(stream); StreamAdapter:=TStreamAdapter.Create(stream) Result := TGPBitmap.Create(StreamAdapter); end;Et la toujours un problème de leak....
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 TCompoCustom.paint; var OGraphics:TGPGraphics; stream:TMemoryStream; StreamAdapter:TStreamAdapter tampon:TBitmap; begin tampon:=nil; .......... tampon:=TBitmap.create(); OGraphics:=TGPGraphics.Create(Canvas.Handle); OGraphics.SetSmoothingMode(SmoothingModeAntiAlias); OGraphics.SetCompositingQuality(QualityModeHigh); OGraphics.DrawImage(TBitmapToTGPBitmap(tampon,stream,StreamAdapter),0,0); try if tampon<>nil then FreeAndNil(tampon); except end; try FreeAndNil(stream); except end; try FreeAndNil(StreamAdapter); except end; try FreeAndNil(OGraphics); except end;
Je ne comprend pas, car même si ca parait un peu bancal de déclarer des var dans un pâint pour les allouer dynamiquement dans une fonction, les variables sont bien libérées....
Quelqu'un pourrait t'il me mettre sur la voie svp, il semblerait que quelque chose m'échappe dans la gestion de la mémoire
Merci
Partager