Delphi - Strukturen Strings nicht befreit [FastMM Leiter]
-
05-07-2019 - |
Frage
Wenn ich erklären
PSomeStruct = ^TSomeStruct;
TSomeStruct = record
s1 : string;
end;
und ich den folgenden Code:
var
p: PSomeStruct;
begin
new(p);
p^.s1:= 'something bla bla bla';
dispose(p);
die FastMM 4 Speicher-Manager berichtet, dass es ein Speicherleck war (Typ: string, Daten-Dump: "etwas bla bla bla"). Allerdings, wenn ich die s1 Zeichenfolge konfiguriere zu leeren, bevor dispose
nannte es ist in Ordnung.
Die zweite Art, wie ich gefunden ist von Plattentyp Klasse zu ändern, dann statt new
ich die Instanz zu schaffen, und statt dispose
Ich rufe instance.Free()
. Es funktioniert ohne die Saiten manuell gereinigt werden.
Gibt es eine Möglichkeit Delphi meine Saiten automatisch zu machen reinigen, wenn ich dispose
nennen?
Lösung
Ist FastMM die erste Einheit in Ihrem .dpr verwendet? Sonst könnte es noch zu früh abgeschlossen sein, falsche memoryleaks Berichterstattung.
Und ist diese vereinfachte codesample erzeugen auch die gleiche Memoryleak wie wenn Sie Ihre JvSimpleXML verwenden? Wenn es nicht ist, gibt es wahrscheinlich mehr los, dann Sie den Verdacht haben.
Meiner Meinung nach. Wenn FastMM einen Speicherverlust berichtet, gibt es eine Memoryleak
Andere Tipps
Sie tun bereits die richtige Sache. Wenn FastMM sagt, dass String ausgelaufen ist, dann ist FastMM falsch, oder es ist die Berichterstattung eine andere Zeichenfolge von dem Sie denken, es ist. Die Dispose
Verfahren löst Strings von Datensätzen.
In diesem speziellen Fall sollte es keine Speicher für diese Saite ohnehin zugewiesen worden ist. Es ist ein Zeichenfolgenliteral, also würde ich den Compiler erwarten, dass die wörtliche zuweisen; der Referenzzähler -1
werden soll, und FastMM nie gesehen haben sollte.