Проблема освобождение памяти.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема освобождение памяти.

Сообщение DYUMON » 16.03.2017 11:51:37

День добрый всем.
Понадобилось тут для собственных нужд сделать прогу для вывода отчетов в excel файл. Использовал для этого FPSpreadsheet. для удобства обернул все это в простой класс.
Код: Выделить всё
unit exlrep;

{$mode objfpc}{$H+}


interface

uses
  Classes, SysUtils, fpspreadsheet, fpsTypes, xlsbiff8, fpsutils, ZDataset, zbase, fpsSearch, DB;

type

  { XlReport }

  XlReport = class(TObject)
  private
    fxlfile: string;
    XLBook: TsWorkBook;
    XLWorksheet: TsWorksheet;
  public
    constructor Create(xlfile: string);
    destructor Destroy;
    procedure WriteDate(SHname: string; mesyac: string; rmove: integer; cmove: integer; ZQ: TZQuery);
    procedure SaveReport();
    function GetSheetName(): string;

  end;


implementation

{ XlReport }

constructor XlReport.Create(xlfile: string);
begin
  XLBook := TsWorkBook.Create;
  fxlfile := xlfile;
  xlbook.ReadFromFile(xlfile, sfExcel8);
end;

destructor XlReport.Destroy;  // есть подозрение что тут не освобождается ничего
begin
  XLWorksheet.Free;
  xlbook.Free;
end;

procedure XlReport.WriteDate(SHname: string; mesyac: string; rmove: integer; cmove: integer; ZQ: TZQuery);
var
  xcol: cardinal; // столбец
  xrow: cardinal;// строка
  XLSearchParams: TsSearchParams;
  XLSearch: TsSearchEngine;
  zy: integer; // проход по строке
  zx: integer; // проход по столбцу
begin
  xcol:=0;
// тут код работы с данными
  XLSearch.Free;
end;


procedure XlReport.SaveReport;
begin
  xlbook.WriteToFile(fxlfile, sfExcel8, True);
end;

function XlReport.GetSheetName: string;
begin
  XLWorksheet := XLBook.GetFirstWorksheet;
  Result := XLWorksheet.Name;
end;

end.


собственно после работы данного кода видно в диспетчере задач , что не освобождается память , запускал выполнение несколько раз и каждый раз обьем занимаемой памяти становился еще больше.
код работы
Код: Выделить всё
var
myrep: XlReport;
begin
myrep := XlReport.Create(report_path + PathDelim + report_name);
myrep.WriteDate('вк1','январь' , 3, 0, dm.N_old);
myrep.savefile;
myrep.free;
end;

Вроде ничего не упустил, но при обработке данного кода память съедается. Подскажите что поправить.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Проблема освобождение памяти.

Сообщение Nick74 » 16.03.2017 12:00:24

XLBook.Close не помогает?
Перечитал, похоже сморозил глупость. Класс же не работает с ОЛЕ? Тогда ой, ищите утечку в библиотеке.
Nick74
новенький
 
Сообщения: 25
Зарегистрирован: 15.03.2017 13:55:06
Откуда: Москва

Re: Проблема освобождение памяти.

Сообщение serbod » 16.03.2017 12:33:02

Соблюдай два простых правила:
1. Если объект нужен только внутри блока (процедуры, функции..), то необходимо его обернуть в try..finally:
Код: Выделить всё
Obj := TObj.Create();
try
  Obj.Use();
finally
  Obj.Free();
end;


2. Если объект используется за пределами блока, то необходимо его привязывать к чему-то, назначить владельца. И при освобождении владельца сперва освобождать подчиненные объекты. Владельцем может быть TObjectList, например.

Как вариант правила 2 - если объект является членом класса, то и освобождать его нужно внутри деструктора класса:
Код: Выделить всё
procedure TObj.UseSomeObj();
begin
  if not Assigned(FSomeObj) then
    FSomeObj := TSomeObj.Create();
  FSomeObj.Use();
end;

destructor TObj.Destroy();
begin
  if Assigned(FSomeObj) then FreeAndNil(FSomeObj);
  inherited Destroy();
end;
Последний раз редактировалось serbod 16.03.2017 17:43:28, всего редактировалось 1 раз.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Проблема освобождение памяти.

Сообщение hinst » 16.03.2017 14:11:32

:roll: :roll: :roll:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Проблема освобождение памяти.

Сообщение pupsik » 16.03.2017 14:27:07

XLWorksheet: TsWorksheet;
он нужен? Вроде как через TsWorkBook можно работать.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Проблема освобождение памяти.

Сообщение slyubez » 16.03.2017 17:03:49

то необходимо его обернуть в try..finally:

Вот только конструктор объекта надо указывать перед try, а не за ним.
slyubez
постоялец
 
Сообщения: 173
Зарегистрирован: 31.03.2015 08:44:07

Re: Проблема освобождение памяти.

Сообщение serbod » 16.03.2017 17:43:59

slyubez писал(а):
то необходимо его обернуть в try..finally:

Вот только конструктор объекта надо указывать перед try, а не за ним.

Да, вы правы. Поправил текст сообщения.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Проблема освобождение памяти.

Сообщение DYUMON » 17.03.2017 05:54:41

C подключенным Heaptrc выскакивает сообщение , очень длинное.
как по нему можно разобрать где именно утечка ?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Проблема освобождение памяти.

Сообщение zub » 17.03.2017 06:21:04

включите отладочную информацию (-g) и номера строк в ошибках времени исполнения (-gl) - вместе с адресами уведите строки и модули - содержимое стека на момент выделения не освобожденной памяти
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Проблема освобождение памяти.

Сообщение DYUMON » 17.03.2017 07:11:46

Вроде разобрался.
Код: Выделить всё
destructor Destroy; <-- забыл override дописать
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Alex2013 и гости: 23

Рейтинг@Mail.ru