Как мне остановить эту утечку памяти Variant? - PullRequest
3 голосов
/ 03 сентября 2010

Я использую старый скрипт-движок, который больше не поддерживается его создателями, и у меня возникли проблемы с утечками памяти Он использует функцию, написанную на ASM, для вызова из сценариев в функции Delphi, и возвращает результат в виде целого числа, а затем передает это целое как нетипизированный параметр другой процедуре, которая переводит его в правильный тип.

Это прекрасно работает для большинства вещей, но когда возвращаемый тип функции Delphi был Variant, он теряет память, потому что вариант никогда не удаляется. Кто-нибудь знает, как я могу взять нетипизированный параметр, содержащий вариант и убедиться, что он будет утилизирован должным образом? Это, вероятно, потребует некоторой встроенной сборки.

procedure ConvertVariant(var input; var output: variant);
begin
  output := variant(input);
  asm
    //what do I put here? Input is still held in EAX at this point.
  end;
end;

РЕДАКТИРОВАТЬ: Отвечая на вопрос Роба Кеннеди в комментариях:

Преобразование AnsiString работает следующим образом:

procedure VarFromString2(var s : AnsiString; var v : Variant);
begin
  v := s;
  s := '';
end;

procedure StringToVar(var p; var v : Variant);
begin
  asm
    call VarFromString2
  end;
end;

Это прекрасно работает и не вызывает утечек памяти. Когда я пытаюсь сделать то же самое с вариантом в качестве входного параметра и назначить исходный Null во второй процедуре, утечки памяти все еще происходят.

Варианты в основном содержат строки - рассматриваемый скрипт используется для генерации XML - и они достигли этого, назначив строку Delphi варианту в функции Delphi, которую вызывает этот скрипт. (Изменение типа возвращаемого значения функции не будет работать в этом случае.)

1 Ответ

3 голосов
/ 04 сентября 2010

Вы пытались использовать тот же трюк, что и со строкой, за исключением того, что в варианте вы должны поставить UnAssigned вместо Null, чтобы освободить его, как вы сделали s := ''; для строки.

И, между прочим, единственная причина, по которой я могу придумать, требует явного освобождения строк, вариантов и т. Д. - это использование некоторых ThreadVar.

...