2

dll 関数から自分のオブジェクト (TCollection から派生) を返そうとしました。私は FastMemoryManager を使用しましたが、成功しませんでした...そのため、いくつかのオブジェクトの動的配列を返そうとしました。
もちろん、dll 関数のセットの配列の長さ。実際にはうまく機能しますが、割り当てられたメモリは解放されません。
(私はWindowsのtarsk managerで測定しています)。動的配列を解放する方法はありますか? dll 関数を呼び出す手順はスレッド内にあり、最終的には次のようになります。

for i := 0 to length(MyObjectArray) - 1 do begin
  if MyObjectArray[i] <> nil then
     MyObjectArray[i].Free;
end;
Setlength(MyObjectArray, 0);
MyObjectArray := nil;

Setlength(MyObjectArray, 0) と MyObjectArray := nilの代わりに使用すると、
FreeAndNil(MyObjectArray) 例外が発生しました。

なにか提案を?

4

1 に答える 1

6

ShareMem は、すべての Delphi DLL および EXE プロジェクト ファイルの最初のユニットですか? FastMM は、Delphi の過去数リリースですでに RTL のメモリ マネージャになっています。

DLL と EXE の間でオブジェクトをまったく共有しないことをお勧めします。それはただの痛みのレシピです。代わりにパッケージを使用してください。

DLL を使用する必要がある場合は、通常の WinAPI 規則を採用することをお勧めします: stdcall 呼び出し規則で、C 互換のデータ型 (整数、浮動小数点数、ポインター、文字列、配列、インターフェイスなどのマネージド型のフィールドを持たないレコード) のみを使用します。DLL に、EXE が解放を担当するメモリの割り当てを行わないようにします。代わりに、EXE が DLL にメモリを割り当てて渡すようにします。または、割り当てを論理ハンドルにカプセル化し、DLL からメモリを破棄する関数をエクスポートします。たとえば、CloseHandleWinAPI 関数がどのように機能するかという行に沿って実行します。

于 2010-09-14T12:03:28.723 に答える