gpt4 book ai didi

json - 德尔福XE8 : Memory Leak with method datasnap server

转载 作者:行者123 更新时间:2023-12-02 06:12:21 32 4
gpt4 key购买 nike

我目前正在使用 Delphi 设计 Datasnap 休息服务器。但我有严重的内存泄漏。

例如我的方法station

procedure TV1.station(ID: integer);
begin


GetInvocationMetadata().ResponseContent := Manager.xxxxxxAPI.GetObjectStation(ID);
GetInvocationMetadata().CloseSession := true;

end;

哪个调用这个函数:

function TSmmAPI.GetObjectStation( const ID: integer ) : string;
(...)
jsonObject := TJSONObject.Create;

stationSelected := xxxxxManager.WorkShops.GetStation( CNCHandle );

with StatesDB.QueryGetCurrentState( stationSelected.Handle ) do begin

if RecordCount <> 0 then begin
ConvertFileToPcom(stationSelected.Ini.FileName, Pcom);


jsonObject.AddPair( TJSONPair.Create('ID', inttostr(ID)));
jsonObject.AddPair( TJSONPair.Create('Name', FieldByName(sbStaStationField).AsString));
jsonObject.AddPair( TJSONPair.Create('Workshop', stationSelected.Shop.Name));
jsonObject.AddPair( TJSONPair.Create('Group', Pcom.Others.GroupName));
jsonObject.AddPair( TJSONPair.Create('CurrentRef', FieldByName(sbStaRefNameField).AsString));
jsonObject.AddPair( TJSONPair.Create('CurrentState', FieldByName(sbStaStateField).AsString));
jsonObject.AddPair( TJSONPair.Create('Job', FieldByName(sbStaOPNameField).AsString));
jsonObject.AddPair( TJSONPair.Create('Order',FieldByName(sbStaOFNameField).AsString));
//(...), I have 12 addpair.

Disconnect;

end;

Destroy;
end;// with StatesDB.QueryGetCurrentState


result := jsonobject.toString;
jsonObject.FreeInstance;
end;

您可以看到,我使用 resultContent 而不是函数的结果,因为我不希望在 json 响应中包含 result:

因此,根据 ReportMemoryLeaksOnShutdown 的报告,我看到我所有的 jsonObject 和每个 jsonpair 都没有被销毁!

Result leak memory report, 5501 request from my client application

来自服务器类的生命周期: session

我使用 DSRESTWebDispatcher,将 session 周期和超时设置为 60000。

有人解释一下吗?我是不是忘记做某事了?

最佳答案

您应该调用 jsonObject.Free 而不是 jsonObject.FreeInstance

您永远不应该直接调用FreeInstance来释放该对象。它是内部分配/释放机制的一部分。在 Delphi 析构函数中,自动调用 FreeInstance 来释放对象实例内存。

在 Delphi 中释放对象实例的正确方法是:

  1. TObject.Free - 如果实例不nil

  2. ,则调用对象实例析构函数
  3. TObject.DisposeOf - 随 Delphi ARC 移动编译器引入,在桌面编译器上调用 TObject.Free

  4. FreeAndNil(var Obj) - 对传递的对象实例调用Free 并引用 nils 的过程

关于json - 德尔福XE8 : Memory Leak with method datasnap server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33332032/

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