3

作成者によってサポートされなくなった古いスクリプトエンジンを使用していて、メモリリークに問題があります。ASMで記述された関数を使用して、スクリプトからDelphi関数を呼び出し、結果を整数として返し、その整数を型なしパラメーターとして別のプロシージャに渡し、正しい型に変換します。

これはほとんどの場合正常に機能しますが、Delphi関数の戻り型がVariantの場合、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実行し、2番目の手順で元のパラメータを割り当てようとすると、メモリリークが発生します。

バリアントには主に文字列が含まれており(問題のスクリプトはXMLを生成するために使用されます)、このスクリプトが呼び出しているDelphi関数のバリアントにDelphi文字列を割り当てることでそこに到達します。(この場合、関数の戻り型を変更しても機能しません。)

4

1 に答える 1

3

Have you tried the same trick as with the string, except that with a Variant, you should put UnAssigned instead of Null to free it, like you did s := ''; for the string.

And by the way, one of the only reasons I can think of that requires to explicitly free the strings, Variants, etc... is when using some ThreadVar.

于 2010-09-03T21:03:50.643 に答える