Also es sieht laut FastMM4 so aus:
Delphi-Quellcode:
type
TBeweis = packed record
EinString: String;
Zahl: Integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Beweis: TBeweis;
p: Pointer;
begin
Beweis.EinString:= 'Test';
p := @Beweis.EinString[1];
FillChar(Beweis,SizeOf(TBeweis),0);
ShowMessage(PChar(p));
end;
erzeugt KEIN MemoryLeak. Der MemoryManager schafft es wohl trotzdem den String nach der Methode mit dem Record freizugeben.
Anders siehts bei globalen Variablen oder Klassenvariablen aus. Da hinterlässt dieser Code ein MemoryLeak. Aber auch das kann verhindert werden:
Finalize(Beweis);
Diese Zeile vor dem FillChar lässt das MemoryLeak verschwinden.
Delphi-Quellcode:
// Globale- oder Klassenvariable
var Beweis: TBeweis;
procedure TForm1.Button1Click(Sender: TObject);
var
p: Pointer;
begin
Beweis.EinString:= 'Test';
p := @Beweis.EinString[1];
Finalize(Beweis); // <---
FillChar(Beweis,SizeOf(TBeweis),0);
ShowMessage(PChar(p));
end;
@Hansa:
Ich weiß, dass es sich bei Records nicht um Pointer handelt. Aber das hat nichts damit zu tun. Fakt ist, dass mit FillChar nur der Pointer zu dem eigentlichen String überschrieben wird. Der String selbst liegt weiterhin im Speicher! Daran ist nichts zu rütteln.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."