Страницы

Поиск по вопросам

четверг, 23 мая 2019 г.

Утечка памяти в TObjectList

Не могу найти решение для устранении утечки.

type TMyObj = class Caption: string; Description: string; Params:string; ParamsLst: TStringList;
public constructor Create(const aPath: string; const aParams: TStrings); overload; destructor Destroy(); override; end;
TDataList = class(TObjectList) public constructor Create; // function LoadFromINI(IniFile: TMemIniFile): boolean; function Remove(Obj: TMyObj): Integer; end;
var TObjData: TDataList;
implementation
constructor TMyObj.Create(const aPath: string; const aParams: TStrings); begin Caption := aParams.Values['Caption']; Description := aParams.Values['Description']; Params := aParams.Values['Params']; if aParams.Values['Params'] <> '' then begin ParamsLst := TStringList.Create; try ExtractStrings([';', ','], [' '], PChar(Params), ParamsLst); except ParamsLst := nil; end; end; end;
destructor TMyObj.Destroy; begin ParamsLst.Free; inherited; end;
constructor TDataList.Create; begin inherited Create; OwnsObjects := True; end;
function TDataList.Remove(Obj: TMyObj): Integer; begin Result := inherited Remove(Obj); end;
initialization TObjData := TDataList.Create;
finalization TObjData.Free;
заполнение TObjData, так
TObjData.Add(TMyObj.Create(sVal, SecParams));


Ответ

Код с учетом замечаний и предложений......
type TData = class private FCaption: string; FDescription: string; FParams: string; FParamsLst: TStringList; //.... public constructor Create(const aPath: string; const aParams: TStrings); destructor Destroy(); override; property Caption: string read FCaption; property Description: string read FDescription; property Params: string read FParams; property ParamsLst: TStringList read FParamsLst; //... end;
TDataList = class(TObjectList) private //... public constructor Create; destructor Destroy(); override; property //... end;
var DataList: TDataList;
implementation
{ TData } constructor TData.Create(const sPath: string; const sData: TStrings); begin Caption := aParams.Values['..']; Description := aParams.Values['..']; Params := aParams.Values['..']; if aParams.Values['..'] <> '' then begin ParamsLst := TStringList.Create; try ExtractStrings([','], [' '], PChar(Params), ParamsLst); except on E: Exception do ShowMessage(E.ClassName + ': ' + E.Message); end; end; end;
destructor TData.Destroy; begin inherited; end; { end TData }
{ DataList } constructor TDataList.Create; begin inherited Create; OwnsObjects := True; end;
destructor TDataList.Destroy; begin inherited; end; { end DataList }
Решение, проблемы ......
procedure TMain.FormDestroy(Sender: TObject); var I: Integer; begin // Удаление списков в объекте for i := 0 to DataList.Count - 1 do begin with DataList.Items[i] do begin ParamsLst.Free; end; end; // При удалении списка оставшиеся в нём объекты будут удалены. FreeAndNil(DataList); end;

Комментариев нет:

Отправить комментарий