Dieses komische Rumgepointere solltest du besser lassen
Length
StringElementSize
StringCodePage
StringRefCount
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.