Утечка памяти !!!
После каждой компиляции методом Compile отъедается память, которая после метода Clear не высвобождается. Это видно невооруженным взглядом в таскменеджере, в отладчике до метода Compile память не меняется, после сразу идет существенная прибавка, после Clear ничего не высвобождается !
Программа пишется на С++ Builder 6, представляет мощный конструктор к базе данных с редакторами форм диалогов, в качестве скрипта взяли FastScripts, но вот такая беда приключается. Сложность скриптов на FastScript достаточная, есть модули по 1000 строк, при этом прибавляется после компиляции по мегабайту, что делать ?????
Программа пишется на С++ Builder 6, представляет мощный конструктор к базе данных с редакторами форм диалогов, в качестве скрипта взяли FastScripts, но вот такая беда приключается. Сложность скриптов на FastScript достаточная, есть модули по 1000 строк, при этом прибавляется после компиляции по мегабайту, что делать ?????
Комментарии
Используйте другие средства.
Помимо Clear так же уничтожайте сам скрипт (fsScript.Free)
Какой результат?
Я попробовал такой еще вариант, делаю буфер откомпайленого кода, и при следующем открытии формы, делаю SetILCode, и потом сразу Execute, проблема всеравно осталась.
Ищу в чем проблема: Сейчас взял большой модуль и добавил от него несколько строк в модуль пустой формы, и !!! память высвободилась нормально, потом добавил еще сотню строк и проблема возникла снова. Вот сейчас сижу и добавляю по одной строке, что бы выяснить, что вызыват проблему
Когда в скриптере используются обычные переменные int, float, string ... то все ОК.
Но когда появляются переменные типа variant, ту начинаются проблемы
Вот кусок одной из форм:
void Button1Click(TObject Sender)
{
variant Cont=Params;
if(Cont!=NULL){
if((this.t1<1) || (this.t2>Cont.Eval("TEST_DOCS_PrihNaklStr.RowsCount")) ||
(this.t1>this.t2))ShowMessage("Неправильный интервал !");
else Cont.Exec("Button2Click",[Null,this.t1,this.t2]);
}else ShowMessage("Вызывается только из приходной накладной !");
Cont=varNull;
}
В форму передается в качестве параметра контекст вызывающей формы, Params - типа variant. Через него вызываются функции вызывающей формы. Дальше я Cont освобождаю и при закрытии формы уже в программе переданный params очищаю.
Что делать ???
проблему локализовал, утечка происходит при вызове функций объекта, в данном случае cont.Exec, даже вызов cont.Exec("...........",100) приводит к утечке ! Чего делать пока не знаю, уже в техподдержку написал.
нужно в fs_iinterpreter.pas вставить недостающий деструктор !!!:
TfsDesignator = class(TfsCustomVariable)
public
destructor Destroy; override;
destructor TfsDesignator.Destroy;
begin
if FLateBindingXMLSource <> nil then
FLateBindingXMLSource.Free;
inherited;
end;
после этого с памятью все ОК