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