我目前正在使用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。
有人有解释吗?我忘记做某事吗?
答案 0 :(得分:5)
您应该致电jsonObject.Free
而不是jsonObject.FreeInstance
您不应该直接调用FreeInstance
来释放对象。它是内部分配/解除分配机制的一部分。在Delphi析构函数中,自动调用FreeInstance
来释放对象实例内存。
在Delphi中发布对象实例的正确方法是:
TObject.Free
- 如果实例不是nil
TObject.DisposeOf
- 在Delphi ARC移动编译器和dektop编译器中引入,它调用TObject.Free
。
FreeAndNil(var Obj)
- 在传递的对象实例上调用Free
的过程和引用的