首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从函数返回Tfield时发生内存泄漏

从函数返回Tfield时发生内存泄漏
EN

Stack Overflow用户
提问于 2013-05-31 06:12:53
回答 2查看 481关注 0票数 0

我在使用Delphi时遇到了一个问题,那就是我要在我的应用程序中创建一个函数,这个函数是这样的

代码语言:javascript
复制
function Get_Foundation_infos(): TFields;
begin
  with TMyQuery.Create(nil) do
  begin
    try
      Connection := DataBaseForm.DataBaseForm1.DataBase;
      SQL.Add('SELECT * FROM `foundation_infos` WHERE `Id`=1');
      Execute;
      Result := Fields;
    except
      on E: Exception do
        Result := nil;
    end;
  end;
end;

问题是我不能从函数的外部释放TMyquery,因为我有一个内存泄漏的问题,应用程序在2到3分钟后停止……

但是如果我在函数内部释放TMyquery对象,那么我就不能从函数调用的外部获得函数结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-31 06:21:14

您需要确保TMyQuery对象比它拥有的TFields对象存在更长的时间。但您还必须确保销毁该TMyQuery对象以避免泄漏。

最简单的方法是从函数返回TMyQuery对象,并让调用者读取字段属性。完成后,销毁TMyQuery对象。当然,您将使用try/finally来确保异常不会导致泄漏。

代码语言:javascript
复制
function CreateFoundationQuery: TMyQuery;
begin
  Result := TMyQuery.Create(nil);
  try
    Result.Connection := DataBaseForm.DataBaseForm1.DataBase;
    Result.SQL.Add('SELECT * FROM `foundation_infos` WHERE `Id`=1');
    Result.Execute;
  except
    Result.Free;
    raise;
  end;
end;
票数 6
EN

Stack Overflow用户

发布于 2013-05-31 06:41:30

我只是找到了另一种方法,也许当我创建一个对象时,没有将它引用到一个具有名称的变量,在这种情况下,内存管理器无法修复内存泄漏,因为我创建了一个具有相同类型函数返回的变量,在这种情况下,内存管理器可以修复这个命名变量的任何内存泄漏……

这是变量的新代码...

代码语言:javascript
复制
function Get_Foundation_infos(): TMyQuery;
var
  q: TMyQuery;
begin
  q := TMyQuery.Create(nil);

  with q do

  begin

    try

      Connection := DataBaseForm.DataBaseForm1.DataBase;

      SQL.Add('SELECT * FROM `foundation_infos` WHERE `Id`=1');
      Execute;

      Result := q;

    except
      on E: Exception do
        Result := nil;
    end;

  end;

end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16846686

复制
相关文章

相似问题

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