tauche gerade ein in die wunderwolle Welt des heaptrc. Nachdem ich all meinen Klassen Destruktoren verliehen habe, wird mir nur noch ein einziger Memory Leak angezeigt: 1 Unfreed memory blocks : 8. Diesen kann ich mir aber nicht erklären und hoffe auf eure Hilfe
Der Call-Trace führt mich zu diesen Code-Zeilen:
Code: Alles auswählen
procedure TContactListItem.assignData(data: PContactData);
begin
FData := data;
Refresh(); // Zeile 767, letzter aufgeführter call um Call-Trace, assignData wird zum Laden von Daten in das Item ausgeführt (ein einziges Mal)
end;
{ Betroffene types }
PPicture = ^TPicture;
TContactListItem = class(TPanel)
private
FData: PContactData;
FMain, FSub: TLabel;
FPic: TImage;
FSelected: boolean;
procedure assignData(data: PContactData);
public
constructor Create(cParent: TScrollBox; cData: PContactData);
destructor Destroy(); override;
procedure Refresh();
property Data: PContactData read FData write assignData;
end;
{ Methoden im Zusammenhang }
procedure TContactListItem.Refresh();
var picPointer: PPicture;
begin
FMain.Caption := FData^.Name;
FSub.Caption := FData^.Skill;
if FData^.nation <> '' then
FSub.Caption := FSub.Caption + ' ⋅ ' + FData^.Nation;
New(picPointer);
picPointer := picList.getPic(FData^.PicPath);
if assigned(picPointer) then
FPic.Picture.Assign(picPointer^);
Dispose(picPointer);
end;
constructor TContactListItem.Create(cParent: TScrollBox; cData: PContactData);
begin
inherited Create(cParent);
Parent := cParent;
FSelected := false;
{ create Layout }
{ create objects }
FMain := TLabel.Create(Self);
FMain.Parent := Self;
FSub := TLabel.Create(Self);
FSub.Parent := Self;
FPic := TImage.Create(Self);
FPic.Parent := Self;
{ Data Pointer }
//New(FData); // ursprünglich dachte ich, Speicherplatz für den Pointer reservieren zu müssen. beim Testen hat sich das aber als falsch erwiesen
assignData(cData);
end;
destructor TContactListItem.Destroy();
begin
FreeAndNil(FMain);
FreeAndNil(FSub);
FreeAndNil(FPic);
//Dispose(FData); // So wie ich ursprünglich Speicherplatz reservieren wollte, wollte ich auch ihn auch wieder frei geben. Das wurde mir mit einem SIGSEV-Fehler gedankt. Hab also New und Dispose auskommentiert
inherited Destroy;
end;
Hat jemand eine Idee, was hier los sein könnte?
LG