2015-10-25 11 views
2

В настоящее время я проектирую сервер отдыха Datasnap с Delphi. Но у меня серьезные утечки памяти.Delphi 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

LifeCycle из класса сервера: Session

Я использую DSRESTWebDispatcher, установленный в Session Цикла и Timout на 60000.

Кто-то есть объяснение? Забыл ли я что-нибудь сделать?

+0

Да это работает, спасибо! – 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) - процедура, которая вызывает Free на пройденный экземпляр объекта и Nils, которые ссылаются на

+0

Благодарим за помощь. Он отлично работает! Я только что открыл Delphi, также я не получил тонкости! – Stackier

+0

Добро пожаловать в Delphi :) Если у вас есть вопросы относительно Delphi, которые не вписываются в Stack Overflow, вы можете свободно спросить их у разработчиков G + Delphi (https://plus.google.com/u/0/communities/103113685381486591754) , [Форумы обсуждения Embarcadero] (https://forums.embarcadero.com/) или [Сообщество Embarcadero] (http://community.embarcadero.com/) –

Смежные вопросы