Утечка памяти !!!

отредактировано 06:30 Раздел: FastScript
После каждой компиляции методом Compile отъедается память, которая после метода Clear не высвобождается. Это видно невооруженным взглядом в таскменеджере, в отладчике до метода Compile память не меняется, после сразу идет существенная прибавка, после Clear ничего не высвобождается !

Программа пишется на С++ Builder 6, представляет мощный конструктор к базе данных с редакторами форм диалогов, в качестве скрипта взяли FastScripts, но вот такая беда приключается. Сложность скриптов на FastScript достаточная, есть модули по 1000 строк, при этом прибавляется после компиляции по мегабайту, что делать ?????

Комментарии

  • отредактировано 06:30
    Таскменеджер не предназначен для контроля утечек памяти.
    Используйте другие средства.
  • отредактировано 06:30
    Ну дак когда после Compile() прибавляется по 1 мегабайту это разве не показатель ??? И когда после полчаса работы возникает сообщение о нехватке виртуальной памяти. Для доказательства, того сто именно скриптер дает данный эффект, сделали пустую форму, на ней скриптер, и прогоняется только метод Compile(), перед этим Clear().
  • отредактировано 06:30
    Проверьте такой вариант:
    Помимо Clear так же уничтожайте сам скрипт (fsScript.Free)
    Какой результат?
  • отредактировано 06:30
    попробовал сначала Clear потом Free, не помогает.
    Я попробовал такой еще вариант, делаю буфер откомпайленого кода, и при следующем открытии формы, делаю SetILCode, и потом сразу Execute, проблема всеравно осталась.
    Ищу в чем проблема: Сейчас взял большой модуль и добавил от него несколько строк в модуль пустой формы, и !!! память высвободилась нормально, потом добавил еще сотню строк и проблема возникла снова. Вот сейчас сижу и добавляю по одной строке, что бы выяснить, что вызыват проблему
  • отредактировано 06:30
    Скорее всего, в скрипте где-то не освобождается созданный объект.
  • отредактировано 06:30
    Нашел в чем проблема, но как избавиться пока не знаю.
    Когда в скриптере используются обычные переменные 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 очищаю.
    Что делать ???
  • отредактировано 06:30
    Попробуйте в скрипте выделять/освобождать память при помощи функций new/delete.
  • отредактировано 06:30
    это не причем, а какая связь интересно у varianta с new/delete ;) ?
    проблему локализовал, утечка происходит при вызове функций объекта, в данном случае cont.Exec, даже вызов cont.Exec("...........",100) приводит к утечке ! Чего делать пока не знаю, уже в техподдержку написал.
  • отредактировано 06:30
    Забыл что в скрипте нет указателей ;)
  • отредактировано 06:30
    А зачем вы создаёте дополнительную переменную ,разве нльзя делать сразу так Params.Eval("TEST_DOCS_PrihNaklStr.RowsCount")
  • отредактировано 06:30
    Внимание, обнаруженная ошибка утечки действительно есть. После долгих дебатов со службой поддержки все-таки нашли ошибку ! Всех кого данная проблема касается, вот исправление, высланное мне службой поддержки:

    нужно в fs_iinterpreter.pas вставить недостающий деструктор !!!:

    TfsDesignator = class(TfsCustomVariable)
    public
    destructor Destroy; override;

    destructor TfsDesignator.Destroy;
    begin
    if FLateBindingXMLSource <> nil then
    FLateBindingXMLSource.Free;
    inherited;
    end;

    после этого с памятью все ОК

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

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.