Json Delphi XE8:使用datasnap server方法的内存泄漏

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

我目前正在用Delphi设计一个Datasnap rest服务器。但我有严重的内存泄漏

例如,我的方法站

哪个函数调用此函数:

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

  • -与Delphi ARC移动编译器一起引入,并在dektop编译器上调用
    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;