Alles mit XE7 Pro
Delphi-Quellcode:
procedure Test;
var
s1,s2: String;
i: Integer;
begin
i := 123;
s1 := IntToStr(I); // der Referenzzähler von s1 ist hier 1 :-)
GetDynVarPrms(s1);
s2 := I.ToString; // der Referenzzähler von s2 ist hier 2 :-(
GetDynVarPrms(s2);
end;
Delphi-Quellcode:
function GetDynVarPrms (
const v):
String;
// zum einfachen Anzeigen der DynVarParameter auf dem Heap
var p: PInteger;
begin
p := Pointer((@v)^);
Result:= '
VarPtr: $' + IntToHex(Integer(@v), 8) + '
, BufPtr: ';
if p <>
NIL then begin
Result := Result + '
$' + IntToHex(Integer(p), 8);
Dec(p);
Result := Result + '
, Len: ' + IntToStr(Integer(p^));
Dec(p);
Result := Result + '
, RefCntr: ' + IntToStr(Integer(p^));
end else Result := Result + '
NIL';
end;
Es hat lange gedauert, bis ich wusste, wieso ich beim Beenden des Programms MemoryLeaks angezeigt bekam.
Alle I.ToString mit IntToStr(I) ausgewechselt und alles war wieder OK.
So wie ich das im Moment sehe, wird der Heap bei jedem Aufruf von I.ToString weiter zugemüllt.
Ein "normales" Programm räumt beim Beenden die ganzen verwaisten Variablen wohl einfach wieder auf, und es werden keine MemoryLeaks angezeigt. Wenn man aber z.B. in Threads mit Windows.Fiber arbeitet, bleiben die MemoryLeaks erhalten, und man sieht sie (mit ReportMemoryLeaksOnShutDown := TRUE).
Hat da jemand eine Idee, wieso dass so ist.
Oder habe ich nur Leaks im Hirn?
Danke