New 和 GetMem 的不同之处
如果操作一个 record 指针中的字符串变量,会不会丢失 string 的内
存空间,造成内存泄漏?
结果是:使用 New() 分配的内存,会自动初始化 record 的内容,并且在 Dispose 时自动
清除所有已分配的内存,包括 string 或其他动态数组的内存。GetMem/FreeMem 没有这个
性质。事实上,New() 中调用了 GetMem,并且执行了一些初始化的操作。
代码如下:
type
PMyRecord = ^TMyRecord;
TMyRecord = record
I: Integer;
S: string;
V: Variant;
end;
{;$DEFINE NEW}
procedure TForm1.Button1Click(Sender: TObject);
var
R: PMyRecord;
I: Integer;
begin
for I := 1 to 1024 do
begin
{$IFDEF NEW}
New(R); // 正确将 R.S 初始化
SetLength(R.S, $FFFF);
Dispose(R); // 正确释放 R.S 内存空间
{$ELSE}
GetMem(R, SizeOf(TMyRecord));
R.S := ''; // 出错
SetLength(R.S, $FFFF);
FreeMem(R);
{$ENDIF}
end;
end;
