New/Dispose に Pointer 型のポインタを渡すと。。。
|
New や Dispose は与えられたポインタの型によって、正しく初期化/解放の処理をしますが、これは、Delphi がコンパイル時にポインタの型情報を隠れた引数としてこれらの関数に与えているからです。
従って、差している先のデータがなんであれ、Dispose はポインタの型を信じ込んでデータの解放を試みます。
すると、次のコードはあっという間にメモリを使い果たします。
var pString1:pString;
pUnknown1:pointer;
i:Integer;
begin
for i:=0 to 2000 do begin
New(pString1);
SetLength(pString1^,10000000);
pUnknown1:=pString1;
Dispose(pUnknown1);
end;
end;
ただし、MemGet/MemFree と同様、ポインタの直接差すメモリブロックのサイズに関しては、Dispose が実行時に取得するため、次のコードは、メモリリークを起こしません。
type
TTest = array [0..1000000] of Double;
pTest = ^TTest;
var
pTest1: pTest;
pUnknown1: pointer;
begin
for i:=0 to 2000 do begin
New(pTest1);
pUnknown1:=pTest1;
Dispose(pUnknown1);
end;
end; |
|