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;
- FillChar的使用方法
- FillChar
- FillChar
- FillChar()
- real类型的不可fillchar
- Delphi 里 FillChar的用法
- [转] FillChar 引起的内存泄漏
- pos、ansipos、fillchar在delphi2010中unicode的问题
- pos、ansipos、fillchar在delphi2010中unicode的问题
- Fillchar过程全解
- fillchar,fillword,filldword,fillbyte用途举例
- Fillchar(var X; Count: Longint; value)
- 的使用方法
- ctags使用方法 ctags的使用方法
- UITabBarController的使用方法、 UINavigationController的使用方法、 presentModalViewController的使用方法
- UITabBarController的使用方法 UINavigationController的使用方法
- ctags使用方法 ctags的使用方法1
- DateTime的一些使用方法
- 点读笔原理
- 贷款利息计算
- GTK+学习手记——1
- EXT.NET(四) SpinnerField
- Iocp Tcp Server——G-Socket1.1 Demo源码(VC & Delphi)
- FillChar的使用方法
- EXT.NET(五)Spinner Plugin
- iPhone/iPad通过iTune更新/恢复固件发生未知错误1015 、1013、3149的原因和解决方法
- open和fopen的区别
- 企业的IT基础设施部署思路
- hdu 2139 Calculate the formula
- iPhone秘籍 第1章 理论知识
- spoj 1470 //splay tree
- 开源:基于百万商业圈.NET开发框架开发的并行带分词的采集器