Einzelnen Beitrag anzeigen

Benutzerbild von Kraisel
Kraisel

Registriert seit: 19. Mär 2012
Ort: Bochum-Linden
64 Beiträge
 
Delphi 12 Athens
 
#1

MemoryLeaks mit s := I.ToString

  Alt 7. Nov 2014, 17:49
Delphi-Version: XE5
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
Peter Kaisler
Das einzig Komplizierte ist zu begreifen wie einfach es ist.

Geändert von Kraisel ( 7. Nov 2014 um 18:03 Uhr)
  Mit Zitat antworten Zitat