Я использую старый скрипт-движок, который больше не поддерживается его создателями, и у меня возникли проблемы с утечками памяти Он использует функцию, написанную на 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, которую вызывает этот скрипт. (Изменение типа возвращаемого значения функции не будет работать в этом случае.)