工作当中,很多时候,我们喜欢使用FillChar填充初始化一个内存块。虽然看起来很简单,但是使用不当就会造成内存泄露,内存泄露往往会导致很多莫名奇妙的问题。
Sample1
procedure TForm1.btn7Click(Sender: TObject);
var
aP: PChar;
begin
aP := nil;
GetMem(aP, 30);
FillChar(aP, SizeOf(AP), #0);
FreeMem(aP, 30);
end;
这样写有问题吗?看起来很平常,或许我们很多人都是这样写的。可是,很不幸的是,当我们用FastMM检测的时候,会很明确的告诉你,这样写会造成内存泄露的,在IDE中运行这段代码,FastMM大概会提示:
“这个应用程序存在内存泄露,小内存块的泄露有:
29-36字节:未知X1
”
解决办法是怎样的呢?很简单,明确之处内存的开始地址:
procedure TForm1.btn7Click(Sender: TObject);
var
aP: PChar;
begin
aP := nil;
GetMem(aP, 30);
FillChar(aP[0], SizeOf(AP), #0);
FreeMem(aP, 30);
end;
进行这样一个小改动之后,FastMM就安静了!
但是这样的一个结论只是针对pchar类型的指针而言。
2 举一反三,数组
在Delphi中,数组分为静态数组、动态数组,静态数组的话,变量名和第一个元素名字均可以表示数组的连续内存的首地址,而对于动态数组呢,则必须明确标示元素0来标示数组分配内存的地址
procedure TForm1.btn8Click(Sender: TObject);
var
MyStaticArr: array [1..10] of char;
MyDynArr: array of char;
begin
FillChar(MyStaticArr, SizeOf(MyStaticArr), #0);
//FillChar(MyStaticArr[1], SizeOf(MyStaticArr), #0);
//以上两种写法都可以
SetLength(MyDynArr, 100);
FillChar(MyDynArr[0], SizeOf(MyDynArr), #0);
//下面就是错误的写法,泄露的内存根据申请的大小而定
FillChar(MyDynArr, SizeOf(MyDynArr), #0);
end;