gpt4 book ai didi

delphi - Delphi-如何从TDataSet中释放内存?

转载 作者:行者123 更新时间:2023-12-03 18:28:53 24 4
gpt4 key购买 nike

D2010,Win7 64位。
你好,

我有一个buttonClick事件,需要处理在另一个例程中打开的TDataSet。
GetDBGenericData。

函数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

最佳答案

如果DS变量由TDataSet分配给另一个GetDBGenericData,则不应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;

关于delphi - Delphi-如何从TDataSet中释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7883019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com