Json Delphi XE8:使用datasnap server方法的内存泄漏
我目前正在用Delphi设计一个Datasnap rest服务器。但我有严重的内存泄漏 例如,我的方法站 哪个函数调用此函数:Json Delphi XE8:使用datasnap server方法的内存泄漏,json,delphi,memory-leaks,datasnap,Json,Delphi,Memory Leaks,Datasnap,我目前正在用Delphi设计一个Datasnap rest服务器。但我有严重的内存泄漏 例如,我的方法站 哪个函数调用此函数: function TSmmAPI.GetObjectStation( const ID: integer ) : string; (...) jsonObject := TJSONObject.Create; stationSelected := xxxxxManager.WorkShops.GetStation( CNCHandle
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;
函数TSmmAPI.GetObjectStation(常量ID:integer):字符串;
(...)
jsonObject:=TJSONObject.Create;
所选站点:=XXXXX经理。车间。GetStation(CNCHandle);
使用StatesDB.QueryGetCurrentState(stationSelected.Handle)开始
如果记录计数为0,则开始
ConvertFileToPcom(stationSelected.Ini.FileName,Pcom);
AddPair(TJSONPair.Create('ID',inttostr(ID));
AddPair(TJSONPair.Create('Name',FieldByName(sbstationfield.AsString));
AddPair(TJSONPair.Create('Workshop',stationSelected.Shop.Name));
AddPair(TJSONPair.Create('Group',Pcom.Others.GroupName));
AddPair(TJSONPair.Create('CurrentRef',FieldByName(sbStaRefNameField.assString));
AddPair(TJSONPair.Create('CurrentState',FieldByName(sbstatefield.AsString));
AddPair(TJSONPair.Create('Job',FieldByName(sbStaOPNameField.AsString));
AddPair(TJSONPair.Create('Order',FieldByName(sbstatofnamefield.AsString));
//(…),我有12对。
断开
结束;
破坏;
完带StatesDB.QueryGetCurrentState
结果:=jsonobject.toString;
jsonObject.FreeInstance;
结束;
您可以看到,我使用resultContent而不是函数的result,因为我不希望在json响应中使用result:
因此,通过ReportMemoryLeaksOnShutdown的报告,我看到我的所有jsonObject和每个jsonpair都没有被销毁
服务器类的生命周期:会话
我使用DSRESTWebDispatcher,将会话周期和超时设置为60000
有人能解释一下吗?我忘记做什么了吗 您应该调用
jsonObject.Free
而不是jsonObject.FreeInstance
决不能直接调用FreeInstance
来释放对象。它是内部分配/解除分配机制的一部分。在Delphi中,析构函数自动调用FreeInstance
来释放对象实例内存
在Delphi中释放对象实例的正确方法有:
nil
TObject.Free
Free
,并将该引用置零的过程是的,很有效,谢谢!谢谢你的帮助。它工作得很好!我刚刚发现了德尔菲,而且我还没有掌握其中的微妙之处!欢迎来到Delphi:)如果您有关于Delphi的问题,而这些问题不适合堆栈溢出,您可以在上自由提问,或者
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;