Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: MemoryLeaks mit s := I.ToString

  Alt 7. Nov 2014, 19:11
Dieses komische Rumgepointere solltest du besser lassen

Delphi-Referenz durchsuchenLength
Delphi-Referenz durchsuchenStringElementSize
Delphi-Referenz durchsuchenStringCodePage
Delphi-Referenz durchsuchenStringRefCount

Ansonsten ist es ganz nett (so hatte ich es vor Einführung dieser Funktionen gemacht), wenn man sich einen Record erstellt (kannst dir bei System.StrRec abgucken) und darüber geht.
P := PStringRec(Pointer(S) - SizeOf(PStringRec)); -> P.RefCount


Da gibt es wohl eine Unpässligkeit beim Erzeugen des InlineCodes für TIntegerHelper.ToString.

Code:
Unit2.pas.31: s1 := IntToStr(I); // der Referenzzähler von s1 ist hier 1 :-)
005DB646 8D55F8           lea edx,[ebp-$08] // out s1
005DB649 8B45F0           mov eax,[ebp-$10] // in i
005DB64C E85B61E4FF      call IntToStr

Unit2.pas.33: s2 := I.ToString; // der Referenzzähler von s2 ist hier 2 :-(
005DB67C 8D55E8           lea edx,[ebp-$18] // out intern_s3 (intern generierte StringVariable)
005DB67F 8B45F0           mov eax,[ebp-$10] // in i
005DB682 E82561E4FF      call IntToStr
005DB687 8D45F4           lea eax,[ebp-$0c] // out s2
005DB68A 8B55E8           mov edx,[ebp-$18] // in intern_s3
005DB68D E886E0E2FF      call @UStrLAsg
Aber nein, das ergibt kein Speicherleck, denn am Ende der Prozedur (im end; ) werden alle 3 String-Variablen freigegeben.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 7. Nov 2014 um 19:19 Uhr)
  Mit Zitat antworten Zitat