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

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都没有被破坏!

结果泄漏内存报告,来自我的客户端应用程序的5501请求

来自服务器类的LifeCycle:Session

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

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

Dal*_*kar 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)- 调用Free传递的对象实例和引用的nils的过程