Delphi XE8:使用方法datasnap服务器进行内存泄漏

时间:2015-10-25 16:26:28

标签: json delphi memory-leaks datasnap

我目前正在使用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

服务器类的LifeCycle:Session

我使用DSRESTWebDispatcher,在Session Cycle和Timout中设置为60000。

有人有解释吗?我忘记做某事吗?

1 个答案:

答案 0 :(得分:5)

您应该致电jsonObject.Free而不是jsonObject.FreeInstance

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

在Delphi中发布对象实例的正确方法是:

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

  2. ,则调用对象实例析构函数
  3. TObject.DisposeOf - 在Delphi ARC移动编译器和dektop编译器中引入,它调用TObject.Free

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