FillChar的使用方法

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


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值