![]() |
Delphi-Version: 10.4 Sydney
Speicherfreigabe / Memory Leak
Hallo,
ich habe wieder ein Problem mit der Speicherfreigabe (ähnlich dem hier: ![]() Ich lese die Anzahl der zu ladenden Icons aus einem MemoryStream und lese dann die ID des jeweiligen Icons ein, um die Grafik dann aus einer vorhanden PNGImageList auszulesen und dann an eine Liste zu übergeben.
Delphi-Quellcode:
// *************************
// Struktur für die Einbindung der Icons // ************************* TIconData = class(TObject) IconID : integer; Png48 : TPNGImage; end; TIconList = TObjectList<TIconData>;
Delphi-Quellcode:
Wir kann ich das IconData an die IconList übergeben, so dass eine Kopie von TIconData entsteht und ich dann das IconData freigeben kann (IconData.Free)?
procedure ReadIconListFromStream(IconBuffer : TMemoryStream; IconList : TObjectList<TIconData>);
var IconData : TIconData; iCount : Integer; i: Integer; begin IconBuffer.Position := 0; IconBuffer.Read(iCount, SizeOf(iCount)); // und dann in einer Schleife einzeln auslesen for I := 0 to iCount-1 do begin // Nummer des Icons auslesen IconBuffer.Read(IconData.IconID, sizeOf(IconData.IconID)); IconData := TIconData.Create; try IconData.Png48 := TPngImage.Create; IconData.Png48.Assign(MainDlg.pngImageListLeft48Standard.PngImages.Items[IconData.IconID].PngImage); IconList.Add(IconData); // ???? finally // IconData.Free; // Memory Leak end; end; end; MainDlg.IconList := TObjectList<TIconData>.Create; ReadIconListFromStream(IconStream, MainDlg.IconList); Ich bedanke mich wieder im Voraus, für einen Hinweis. |
AW: Speicherfreigabe / Memory Leak
Delphi-Quellcode:
Wozu eine Kopie? Du hast ja schon je Durchlauf ein neues TIconData.
try
IconData.Png48 := TPngImage.Create; IconData.Png48.Assign(MainDlg.pngImageListLeft48Standard.PngImages.Items[IconData.IconID].PngImage); IconList.Add(IconData); // ???? except IconData.Free; raise; end; Und das eigentliche Freigeben macht die ObjectList mit OwnsObjects=True. Aber warum ist das IconBuffer.Read vor dem TIconData.Create? Der Compiler sollte da eigentlich auch meckern, vonwegen nicht initialisierte Varaible. Wenn ja, warum hörst du nicht auf ihn? |
AW: Speicherfreigabe / Memory Leak
Zitat:
Zitat:
Natürlich wird TIconData.Create vor dem IconBuffer.Read ausgeführt.:thumb: |
AW: Speicherfreigabe / Memory Leak
Was ich in deinem Code noch vermisse ist die Freigabe des Png48 Objekts. Wenn TIconData freigegeben wird, muss auch das Png48 freigegeben werden, sonst hagelt es von Memoryleaks. Überschreibe dafür den Destroy Destructor in TIconData:
Delphi-Quellcode:
type
TIconData = class(TObject) public IconID : integer; Png48 : TObject; destructor Destroy(); override; end; TIconList = TObjectList<TIconData>; { TIconData } destructor TIconData.Destroy; begin Png48.Free; inherited; end; |
AW: Speicherfreigabe / Memory Leak
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz