Hallo,
Nutze Delphi 6.0 mit RAInterpreter (frühe Form vom JVCL Interpreter), die allerdings schon stark abgeändert wurde, und deshalb kann ich auch nicht auf JVCL Interpreter umsteigen (das mal vorweg)
Ich habe nun bemerkt, das ich eine Reihe von Memory Leaks bekomme (habe mir mal die Trial von AQtime runtergeldane)
Es sieht so aus, als ob die Speicherleaks vom Delphi internen Stringhandling herkommen. (zumindest kommt es definitiv nicht von einem GetMem, einer TClass.Create oder sonstiges sondern vielleicht von einem vergessenen variant String? (falls es soetwas gibt))
Leak #1
Delphi-Quellcode:
[ParseToken] TokenStr1 := Parser.Token; // TokenStr1 ist string
[Token] SetString(Result, F, P-F); // F und P sind PChar, Result ist string
[LStrFromPChar]
[NewAnsiString]
das in den Eckigen Klammern sind die Funktionen (von LStrFromPChar und NewAnsiString kennt er nicht die
unit, wird wohl system.pas sein)
und das 2. Leak ist bei
Delphi-Quellcode:
[ParseToken] Token1 := Copy(TokenStr1, 2, Length(TokenStr1) - 2); // Token1 .. variant, TokenStr1 .. string
[LstrCopy]
[LStrFromPCharLen]
[NewAnsiString]
Ich habe mir mal die Variants Funktionen angeschaut, und was der Compiler beim kopieren von strings macht, man sieht eigentlich nur das wenn ein Variant String in einen anderen Variant kopiert wird, der Dest zuerst auf null gesetzt wird, und dann die Pointer kopiert werden.
Daher müsste eigentlich Delphi irgendwo mitführen wieviele Instancen von einem Variant String vorhanden sind und dann bei Bedarf den String freigeben (nachdem die letzte Instanz auch auf null gesetzt wird) Oder ?
Hat jemand genauere Info's, damit ich weiß, wo ich suchen (und debuggen und memproofen) kann.