Delphi Tips 
-----------------------------

0006  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/02/08 osamu 編集
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;
参照: [Delphi-ML:18664] <PASCAL> <メモリ>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp