![]() |
Re: Speicherleck bei verschachtelten Objekten
Vielleicht kommt EurekaLog nur nicht mit sowas klar
in einer Funktion reservieren und wo anders freigeben (vorallem wenn man dieses über lokale Variablen erledigt). Ich hätt es in etwa so gemacht (k.A. ob EurekaLog dieses nun mag). Finde es so auch übersichtlicher, da man nun nicht gucken muß, was mit den lokalen variavblen passiert, bzw. wie die wo verwenden werden.
Delphi-Quellcode:
procedure TTC7AutoStart.CreateAutoStartStruc(var AutoStartStruc: TTC7AutoStartStruc);
{ Setzt die Daten eines AutoStartStruc auf definierte Anfangswerte. } begin AutoStartStruc := TTC7AutoStartStruc.Create; with AutoStartStruc do begin Index := -1; EntryType := asUndefined; AutoStartDangerLevel := dlMiddle; UniqueID := ''; IconCacheIndex := -1; DeterminedFile := ''; Status := stEnabled; HasEncyclopediaEntry := false; EncyclopediaInfo := TTC7EncyclopediaData.Create; with EncyclopediaInfo do begin PrimaryID := ''; SecondIDList := ''; Caption := ''; Teaser := ''; Description := ''; CreateDate := ''; DangerLevel := 1; //entspricht dlMiddle end; with DeterminedFileInfo do begin CompanyName := ''; FileDescription := ''; FileVersion := ''; InternalName := ''; LegalCopyright := ''; LegalTrademarks := ''; OriginalFilename := ''; ProductName := ''; ProductVersion := ''; Comments := ''; end; with FileData do begin FileName := ''; FileHash := ''; FileAttr := -1; FileDate := 0; FileSize := -1; FileTextLineCount := -1; end; with RegData do begin MainKey := ''; Path := ''; Key := ''; Value := ''; ValueHash := ''; end; end; end; |
Re: Speicherleck bei verschachtelten Objekten
Hatte ich vorher, mit dem gleichen Ergebnis.
|
Re: Speicherleck bei verschachtelten Objekten
TTC7AutoStart ist von TObjectList abgeleitet und die Eigenschaft OwnsObjects ist True (Standardbelegung).
Alle Objekte die der Liste hinzugefügt werden, werden von dieser auch freigegeben. EncyclopediaInfo := TTC7EncyclopediaData.Create; Wer ist aber verantwortlich "EncyclopediaInfo" freizugeben? Scheinbar doch die Instanz der Klasse TTC7AutoStartStruc und dafür benötigt diese einen destructor. Das setzen von definierten Vorbelegungen der Felder ist auch Aufgabe der Klasse selbst, dafür schreibt man einen constructor.
Delphi-Quellcode:
type
TTC7EncyclopediaData = class(TObject) constructor Create; {.. Felder ..} end; TTC7AutoStartStruc = class(TObject) constructor Create; destructor Destroy; override; {.. Felder ..} end; constructor TTC7AutoStartStruc.Create; begin inherited; PrimaryID := ''; SecondIDList := ''; {... usw ...} end; constructor TTC7AutoStartStruc.Create; begin inherited; {eigene Objekte erzeugen} EncyclopediaInfo := TTC7EncyclopediaData.Create; {Felder vorbelegen} Index := -1; EntryType := asUndefined; {... usw ...} end; destructor TTC7AutoStartStruc.Destroy; begin {eigene Objekte freigeben} EncyclopediaInfo.Free; inherited; end; |
Re: Speicherleck bei verschachtelten Objekten
Nicht schlecht. Erst TList mit Pointern, dann TObjectList mit Pointern, nun TObjectList mit TObjects. Es wird immer besser, der Code übersichtlicher, ich danke euch vielmals.
Wir haben es gleich geschafft, ich hoffe ich darf noch auf eure Hilfe zählen. EurekaLog meldet nun noch Speicherlecks hier:
Delphi-Quellcode:
Scheinbar darf ich das lokale Objekt nicht so einfach erstellen, der Liste hinzufügen und fertig. Freigeben darf ich das lokale Objekt auch nicht.
function TTC7AutoStart.NewObservationFile(ASKind: TTC7AutoStartKind; FileName: string): boolean;
var ASStruc: TTC7AutoStartStruc; // ASPointer: PTTC7AutoStartStruc; begin result := false; if FileExists(FileName) then begin ASStruc := TTC7AutoStartStruc.Create; //<- Speicherleck // ASStruc.EncyclopediaInfo := TTC7EncyclopediaData.Create; // CreateAutoStartStruc(ASStruc); Result := true; ASStruc.Index := Self.Count; ASStruc.EntryType := ASKind; ASStruc.FileData.FileName := FileName; ASStruc.FileData.FileHash := THash_SHA256.CalcFile(FileName, TFormat_HEX); ASStruc.FileData.FileAttr := FileGetAttr(FileName); ASStruc.FileData.FileDate := FileDateToDateTime(FileAge(FileName)); ASStruc.FileData.FileSize := GetFileSize(FileName); if ASKind=asTextFile then ASStruc.FileData.FileTextLineCount := GetTextLineCountOfFile(FileName); ASStruc.UniqueID := CreateUniqueID(ASStruc); ASStruc.AutoStartDangerLevel := GetDangerLevel(ASStruc.UniqueID); ASStruc.DeterminedFile := ASStruc.FileData.FileName; GetFileInfo(ASStruc.FileData.FileName, ASStruc.DeterminedFileInfo); ASStruc.IconCacheIndex := IconCache.FileCacheIndex(ASStruc.FileData.FileName, true); // New(ASPointer); // ASPointer^ := ASStruc; Self.Add(ASStruc); // ASStruc.Free; end; end; |
Re: Speicherleck bei verschachtelten Objekten
Meldet EurekaLog das immernoch, wenn du dort, wo //ASStruc.Free; steht, mal ein ASStruc := nil; machst?
|
Re: Speicherleck bei verschachtelten Objekten
ja, leider
|
Re: Speicherleck bei verschachtelten Objekten
Die Ursache scheint aber nicht mehr in den bekannten Teilen deines Programms zu liegen.
Am einfachsten den jetzigen Stand des Projekts mal als Attachment hochladen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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