Sta*_*ier 2 delphi json memory-leaks datasnap
我目前正在使用Delphi设计Datasnap休息服务器.但我有严重的内存泄漏.
例如,我的方法站
procedure TV1.station(ID: integer);
begin
GetInvocationMetadata().ResponseContent := Manager.xxxxxxAPI.GetObjectStation(ID);
GetInvocationMetadata().CloseSession := true;
end;
Run Code Online (Sandbox Code Playgroud)
哪个叫这个功能:
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;
Run Code Online (Sandbox Code Playgroud)
你可以看到,我使用resultContent而不是函数的结果,因为我不希望结果:在我的json响应中.
所以使用ReportMemoryLeaksOnShutdown的报告,我看到我所有的jsonObject和每个jsonpair都没有被破坏!
来自服务器类的LifeCycle:Session
我使用DSRESTWebDispatcher,在Session Cycle和Timout中设置为60000.
有人有解释吗?我忘记做某事吗?
你应该打电话jsonObject.Free而不是jsonObject.FreeInstance
你永远不应该FreeInstance直接调用释放对象.它是内部分配/解除分配机制的一部分.在Delphi中,析构函数会FreeInstance自动调用以释放对象实例内存.
在Delphi中发布对象实例的正确方法是:
TObject.Free - 如果实例不是,则调用对象实例析构函数 nil
TObject.DisposeOf- 介绍Delphi ARC移动编译器和它调用的dektop编译器TObject.Free.
FreeAndNil(var Obj)- 调用Free传递的对象实例和引用的nils的过程
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |