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:
...
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;
...
Ich hoffe ihr könnt mir helfen.
Danke schon im Voraus.
Gruss
Stefan