![]() |
Variants / Strings / Memory Leaks
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:
das in den Eckigen Klammern sind die Funktionen (von LStrFromPChar und NewAnsiString kennt er nicht die unit, wird wohl system.pas sein)
[ParseToken] TokenStr1 := Parser.Token; // TokenStr1 ist string
[Token] SetString(Result, F, P-F); // F und P sind PChar, Result ist string [LStrFromPChar] [NewAnsiString] und das 2. Leak ist bei
Delphi-Quellcode:
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.
[ParseToken] Token1 := Copy(TokenStr1, 2, Length(TokenStr1) - 2); // Token1 .. variant, TokenStr1 .. string
[LstrCopy] [LStrFromPCharLen] [NewAnsiString] 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. |
Re: Variants / Strings / Memory Leaks
Hab ihn, den "Bug"
Da gibts ne Funktion, die einen variant in einen anderen kopiert, und dabei ab und zu direkt die Daten des variants überschreibt, daher wird dann in diesem Fall _LStrClr nicht aufgerufen und deshalb auch der RefernzZähler nicht runtergezählt. Dank geht übrigens an motzi für das wirklich gute Tutorial über Strings ( ![]() |
Re: Variants / Strings / Memory Leaks
Oh.. die Firma dankt!! ;)
|
Re: Variants / Strings / Memory Leaks
Dieser Leak scheint auch in JVInterpreter noch zu existieren. Zumindest bekomme ich den Leak #1 auch angezeigt, wenn ich mein Programm mit memproof teste.
Ich habe mir auch mal die alte RaLib besorgt. Die Funktion zum Kopieren von Variants hat sich nicht entscheidend geändert: procedure RAI2VarCopy(var Dest: Variant; const Source: Variant); begin if TVarData(Source).VType in [varArray, varRecord] then TVarData(Dest) := TVarData(Source) else Dest := Source; end; Erinnerst Du Dich noch an den Bugfix und kannst ihn hier veröffentlichen? |
Re: Variants / Strings / Memory Leaks
Mmh. Interessant. Mit Pascal Script und memCheck hab ich auch unerklärliche Speicherlecks bei Strings. Könnte vielleicht damit zusammenhängen ... Deshlab hoffe ich auf eine Lösung :)
|
Re: Variants / Strings / Memory Leaks
hmmmm, dachte es war in der funktion, aber ist es nicht,
wo hast du dir den alten RAI runtergeladen ? Dann kann ich mal nen Filecompare machen (mit dem neuem JVInterpreter findet er zu viele Unterschiede, da ja die Klassen anders heißen) Oder häng die zwei Files RAI2.pas und RAI2Parser.pas hier an. |
Re: Variants / Strings / Memory Leaks
Die RaLib 1.6 habe ich hier geladen:
![]() Evtl. hast Du aber eine andere als Basis genommen? Du könntest auch Deine Version als PN schicken, dann vergleiche ich es. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz