![]() |
Datenbank: Firebird • Zugriff über: ADO
Memory Leak bei Verwendung von TIBDataSet
Guten Tag
Ich habe ein Problem beim Freigeben von Speicher einer IBDataSet. Und zwar wird der Speicher trotz Free, FreeAndNil, Release einfach nicht frei. Kann nicht verstehen was der Grund dafür ist. Das DataSet ist in einer Klasse die mehrmals erzeugt und auch wieder zerstört wird, was mit der Zeit zu einem deutlichen Memoryleak führt. Hier die Klasse (nur Konstruktor und Destruktor):
Delphi-Quellcode:
unit UnitLayoutAssignmentManager;
interface uses SysUtils, Variants, Classes, DB, IBDatabase, IBCustomDataSet; type TLayoutAssignmentManager = class(TObject) private { Private-Deklarationen } myIBTransaction: TIBTransaction; myIBDataSet: TIBDataSet; procedure LoadLayoutPath; procedure LoadLayoutAssignments; public { Public-Deklarationen } constructor CreateWithDB(db: TIBDatabase); destructor Destroy; override; function GetLayoutForMatnr(matnr: string): string; procedure AddAssignment(matnr, layout: string); published property DataSet: TIBDataSet read myIBDataSet; end; var LayoutAssignmentManager: TLayoutAssignmentManager; LayoutPath: String; implementation // Datenbank ist bereits vorher erzeugt worden und wird im Konstruktor übergeben constructor TLayoutAssignmentManager.CreateWithDB(db: TIBDatabase); begin inherited Create; myIBDataset := TIBDataSet.Create(nil); myIBTransaction := TIBTransaction.Create(nil); // DataSet und Transaction mit DB verbinden with myIBTransaction do begin DefaultDatabase := db; end; with myIBDataSet do begin Database := db; Transaction := myIBTransaction; end; ... end; destructor TLayoutAssignmentManager.Destroy; begin // Hier ist die Stelle, an der der Speicher nicht freigegeben wird myIBTransaction.Free; myIBDataSet.Free; inherited Destroy; end; end. Und hier die Stelle an der die Klasse eingesetzt wird:
Delphi-Quellcode:
Ich hoffe ihr könnt mir helfen.
...
layoutAssignmentManager := TLayoutAssignmentManager.CreateWithDB(IBDB1); layout := layoutAssignmentManager.GetLayoutForMatnr(matnr); if Length(layout) = 0 then begin // Es wurde keine oder keine gültige Zuweisung gefunden // -> neue Zuweisung erstellen OpenDialog1.Title := 'Layout für Materialnummer "' + matnr + '" auswählen'; if OpenDialog1.Execute then begin layout := ChangeFileExt(ExtractFileName(OpenDialog1.FileName),''); layoutAssignmentManager.AddAssignment(matnr, layout); end; end; // Speicher freigeben layoutAssignmentManager.Free; ... Danke schon im Voraus. Gruss Stefan |
Re: Memory Leak bei Verwendung von TIBDataSet
Ich würde sie Klasse als Owner übergeben, dann kümmert die sich automatisch um die Entsorgung des DataSets.
|
Re: Memory Leak bei Verwendung von TIBDataSet
Häng dir doch FastMM4 rein und schalte die TD32-Debug-Infos an. Dann bekommst du doch raus obs an dir oder an TIBDataset liegt.
|
Re: Memory Leak bei Verwendung von TIBDataSet
ein Objekt mit
Delphi-Quellcode:
zu erzeugen ist immer schlecht.
XYZ.create (nil);
Wer soll da wissen, wer für das neue Objekt zuständig ist. Es hat schon seinen Sinn, dass man da einen Owner übergeben soll. In der Regel ist der Self ein guter Kandidat für den Owner... |
Re: Memory Leak bei Verwendung von TIBDataSet
Hallo,
zu jedem Create gehört ein try finally. Was ich an deinem Bsp z.B. nicht sehe ist ein layout.Free. Nimm fastmm4 oder memcheck (das bevorzuge ich). Heiko |
Re: Memory Leak bei Verwendung von TIBDataSet
Ich hab die Klasse nun von TComponent abgeleitet und IBDataSet self als Owner übergeben.
Scheint ganz gut zu klappen. @ hoika: layout ist ein String. Bin noch recht neu bei Delphi, aber so wie ich das verstanden habe, muss man Strings weder erzeugen noch zerstören. Danke nochmal für die Hilfe und Gruss Stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 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