Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicherleck bei verschachtelten Objekten (https://www.delphipraxis.net/127494-speicherleck-bei-verschachtelten-objekten.html)

himitsu 15. Jan 2009 15:40

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;

LeoDD 15. Jan 2009 15:46

Re: Speicherleck bei verschachtelten Objekten
 
Hatte ich vorher, mit dem gleichen Ergebnis.

Blup 16. Jan 2009 12:35

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;

LeoDD 16. Jan 2009 13:20

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:
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;
Scheinbar darf ich das lokale Objekt nicht so einfach erstellen, der Liste hinzufügen und fertig. Freigeben darf ich das lokale Objekt auch nicht.

himitsu 16. Jan 2009 13:25

Re: Speicherleck bei verschachtelten Objekten
 
Meldet EurekaLog das immernoch, wenn du dort, wo //ASStruc.Free; steht, mal ein ASStruc := nil; machst?

LeoDD 16. Jan 2009 13:38

Re: Speicherleck bei verschachtelten Objekten
 
ja, leider

Blup 16. Jan 2009 16:14

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.
Seite 2 von 2     12   

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