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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top