以下の関数により、このメモリを開放することが出来ます(forms.pas の implementation セクションに書かないといけません)。
Procedure DeleteInstBlockList;
Var
Block : PInstanceBlock;
Begin
If InstBlockList <> nil
Then Repeat
Block := InstBlockList^.Next;
VirtualFree(InstBlockList, 4096, MEM_DECOMMIT);
InstBlockList := Block;
Until Block = NIL;
end;
そして、forms.pas の finalization セクションから、この関数を呼び出してください。
finalization
..
..
DeleteInstBlockList;
end.
Jean-Paul Collard 追記:
MemProof によれば、"entry0408.html"で説明されているメモリ損失(4KB)は、あらゆるアプリケーションに影響します(DLL だけではありません)。提案されている回避方法(Forms.pas の Procedure DeleteInstBlockList)は、私の環境ではハングアップします。
(Windows 98 SE + Delphi 3.0 で)正常に動作する解決方法を提案します:
SysUtils.pas の interface の任意の位置に変数を追加します:
var ErraticBlock: pointer; // 追加
SysUtils.pas の finalization の最後に1行追加します:
finalization
FreeTerminateProcs;
DoneExceptions;
VirtualFree( ErraticBlock, 4096, MEM_DECOMMIT); // 追加
end.
最後に、Forms.pas に1行を追加します:
function MakeObjectInstance(Method: TWndMethod): Pointer;
const
......
begin
if InstFreeList = nil then
begin
Block := VirtualAlloc(nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
ErraticBlock:=Block; // 追加
Block^.Next := InstBlockList;
......
|