2015-10-25 101 views
2

我目前正在设计一个Datasnap休息服务器与德尔福。但我有严重的内存泄漏。德尔福XE8:内存泄漏与方法datasnap服务器

例如,我的方法

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响应。

因此,从ReportMemoryLeaksOnShutdown的报告中,我看到我所有的jsonObject和每个jsonpair都不会销毁!从服务器类

Result leak memory report, 5501 request from my client application

生命周期:会话

我用DSRESTWebDispatcher,在60000

有人在会议周期和Timout设置有一个解释?我忘了做什么?

+0

是它的工作原理,谢谢尼尔斯来电Free! – Stackier

回答

5

你应该叫的jsonObject.Free代替jsonObject.FreeInstance

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

正确的方式来释放对象实例在Delphi是:

  1. TObject.Free - 调用对象实例的析构函数,如果实例不nil

  2. TObject.DisposeOf - 用Delphi ARC移动编译器和dektop编译它推出请致电TObject.Free

  3. FreeAndNil(var Obj) - 过程,它传递对象实例和引用

+0

谢谢你的帮助。它很棒!我刚刚发现了德尔福,我也没有获得这些微妙的东西! – Stackier

+0

欢迎来到德尔福:)如果你有关于德尔福的问题,不适合堆栈溢出,你可以[G + Delphi开发人员](https://plus.google.com/u/0/communities/103113685381486591754) ,[Embarcadero讨论论坛](https://forums.embarcadero.com/)或[Embarcadero社区](http://community.embarcadero.com/) –