我对Delphi有一个问题,就是我在我的应用程序中创建一个函数,这个函数是这样的
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
对象,那么我无法从函数调用的外部获取函数结果。
答案 0 :(得分:6)
您需要确保TMyQuery对象超过它拥有的TFields对象。但是您还必须确保销毁该TMyQuery对象以避免泄漏。
最简单的方法是从函数返回TMyQuery对象,让调用者读取Fields属性。完成后,销毁TMyQuery对象。当然,您将使用try / finally确保异常不会导致泄漏。
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;
答案 1 :(得分:0)
我只是找到了另一种方式,当我创建一个对象而没有将它引用到一个带有名称的变量时,内存管理器无法在这种情况下修复内存泄漏,因为我创建了一个具有相同类型函数的变量返回,在这种情况下,内存管理器可以使用此命名变量修复任何内存泄漏....
这是变量的新代码......
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;