AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Speicherleck bei verschachtelten Objekten
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherleck bei verschachtelten Objekten

Ein Thema von LeoDD · begonnen am 14. Jan 2009 · letzter Beitrag vom 16. Jan 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#11

Re: Speicherleck bei verschachtelten Objekten

  Alt 15. Jan 2009, 15:40
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#12

Re: Speicherleck bei verschachtelten Objekten

  Alt 15. Jan 2009, 15:46
Hatte ich vorher, mit dem gleichen Ergebnis.
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: Speicherleck bei verschachtelten Objekten

  Alt 16. Jan 2009, 12:35
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;
  Mit Zitat antworten Zitat
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Speicherleck bei verschachtelten Objekten

  Alt 16. Jan 2009, 13:20
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.
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#15

Re: Speicherleck bei verschachtelten Objekten

  Alt 16. Jan 2009, 13:25
Meldet EurekaLog das immernoch, wenn du dort, wo //ASStruc.Free; steht, mal ein ASStruc := nil; machst?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#16

Re: Speicherleck bei verschachtelten Objekten

  Alt 16. Jan 2009, 13:38
ja, leider
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: Speicherleck bei verschachtelten Objekten

  Alt 16. Jan 2009, 16:14
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz