【发布时间】:2016-08-30 07:32:20
【问题描述】:
有两个用 Delphi 编写的服务。一项服务在服务器上运行,而另一项服务在客户端上运行。这两个服务进行通信以在客户端和服务器之间交换数据。在这种情况下,服务器服务要求客户端发送数据,但是大约一天后,服务器上分配的内存超过了它的物理大小。经过一番研究,我发现下面这两个函数有问题。
以下代码是否存在内存泄漏?
服务器服务:
function TServerMethods.LogInMngr_GetAllUsers(): TList<TLogInClass>;
Var
C: TDBXCommand;
Begin
C := CreateCommand('LogInMngr_GetAllUsers');
try
C.ExecuteUpdate;
Result := GetValue<TList<TLogInClass>>(C.Parameters[RP]);
finally
C.Free;
end;
end;
客户服务:
function TLogInMngrClass.GetAllUsers(status: TLogInStatus = lisUnknown): TList<TLogInClass>;
var
LogIn: TLogInItem;
LogInTemp: TLogInClass;
UsedProg: TUsedItem;
begin
Result := TList<TLogInClass>.Create;
for LogIn in LogInList do
if (status = lisUnknown) or (LogIn.Status = Integer(status)) then
for UsedProg in LogIn.UsedProgList do
begin
LogInTemp:=TLogInClass.Create(LogIn.ClientID, LogIn.ComputerName, LogIn.UserName, '', '');
LogInTemp.LogInTime := DateTimeToFileTime(UsedProg.AccessTime);
LogInTemp.Status := LogIn.Status;
LogInTemp.ProgName := UsedProg.ItemName;
LogInTemp.ProgVersion := UsedProg.ItemInfo;
Result.Add(LogInTemp);
end;
end;
数据在TLogInClass 类中,结果使用TDSServer 作为TLogInClass 类的通用列表返回。
【问题讨论】:
-
"这个 delphi 代码是否存在内存泄漏?" 可能是的,但在您发布的代码中没有证据表明这一点。没有证据表明
TList<TLogInClass>是如何被释放的。它也应该是一个拥有价值的TObjectList,但这只是一个猜测,就像答案一样 -
您没有显示两个结果
TList<TLogInClass>是如何被释放的。请添加此信息。 -
要么生成minimal reproducible example,要么进行一些调试。
标签: delphi memory memory-management memory-leaks