FillChar的使用方法

来源:互联网 发布:反清复明 知乎 编辑:程序博客网 时间:2024/06/05 07:37

    工作当中,很多时候,我们喜欢使用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;