首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从TDataSet中释放内存?

如何从TDataSet中释放内存?
EN

Stack Overflow用户
提问于 2011-10-25 07:11:43
回答 1查看 2.3K关注 0票数 2

D2010、Win7 64位。你好,

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

函数GetDBGenericData返回一个TDataSet。这个例程主要是获取一个tQuery组件,设置它的SQL属性,然后打开它。然后,它将TDataSet返回给我的按钮单击。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-25 07:16:18

如果您的DS变量被GetDBGenericData分配了另一个TDataSet,那么您既不应该使用Create,也不应该使用Free。您只是使用它来引用现有的数据集。

代码语言:javascript
复制
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;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7883019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档