2011-10-24 8 views
2

D2010、Win7 64bit。 こんにちは、Delphi - TDataSetからメモリを解放するには?

は、私は別のルーチン... GetDBGenericDataにオープンしたTDataSetのを処理する必要があるとbuttonClickイベントを持っています。

関数GetDBGenericDataは、TDataSetを返します。このルーチンは、基本的にtQueryコンポーネントをとり、SQLプロパティを設定して開きます。次にTDataSetをbuttonclickに返します。

procedure TForm1.Button2Click(Sender: TObject); 
var 
DS : TDataSet; 
begin 

DS := TDataSet.Create(nil); 
DS := GetDBGenericData(dbSOURCE, 'LIST_ALL_SCHEMAS', []); 

while Not DS.EOF do 
    begin 
    ShowMessage(DS.FieldByName('USERNAME').AsString); 
    DS.Next; 
    end; 

DS.Close; 
DS.Free; 

私の問題は - DSの理解です。 私はここでこのルーチンで作成しています。私はそれをコンポーネントを指すTDataSetに「割り当てる」。私がそれを解放しないと、私はメモリリークを持っています(EurekaLogによって報告されたように)。 私が自由にすると、次回このルーチンを実行するときにAVを取得します。 (具体的にはGetDBGenericDataルーチンの内部)。

私は、DSが返されているTDataSetに割り当てられているので、実際にはこのルーチンでDSを解放していますが、GetDBGenericDataのtQueryでは私は無料です。

どのようにリンケージを「中断」し、動的に作成しているメモリだけを削除しますか。

おかげで、 GS

答えて

4

あなたDS変数がGetDBGenericDataTDataSetが割り当てられている場合は、あなたがCreateFreeそれもないはず。既存のデータセットを参照するためだけに使用しています。

procedure TForm1.Button2Click(Sender: TObject); 
var 
    DS : TDataSet; 
    UserNameField: TField; // Minor change for efficiency 
begin 
    DS := GetDBGenericData(dbSOURCE, 'LIST_ALL_SCHEMAS', []); 

    // Call FieldByName only once; no need to create or 
    // free this either. 
    UserNameField := DS.FieldByName('USERNAME'); 

    while not DS.Eof do 
    begin 
    ShowMessage(UserNameField.AsString); 
    DS.Next; 
    end; 

    // I'd probably remove the `Close` unless the function call 
    // above specifically opened it before returning it. 
    DS.Close; 
end; 
+0

それは...ありがとうございました。 – user1009073

関連する問題