工作当中,很多时候,我们喜欢使用FillChar填充初始化一个内存块。虽然看起来很简单,但是使用不当就会造成内存泄露,内存泄露往往会导致很多莫名奇妙的问题。

Sample1

procedure TForm1.btn7Click(Sender: TObject);
varaP: PChar;
beginaP := nil;GetMem(aP, 30);FillChar(aP, SizeOf(AP), #0);FreeMem(aP, 30);
end;

这样写有问题吗?看起来很平常,或许我们很多人都是这样写的。可是,很不幸的是,当我们用FastMM检测的时候,会很明确的告诉你,这样写会造成内存泄露的,在IDE中运行这段代码,FastMM大概会提示:

“这个应用程序存在内存泄露,小内存块的泄露有:

29-36字节:未知X1

解决办法是怎样的呢?很简单,明确之处内存的开始地址:

procedure TForm1.btn7Click(Sender: TObject);
varaP: PChar;
beginaP := nil;GetMem(aP, 30);FillChar(aP[0], SizeOf(AP), #0);FreeMem(aP, 30);
end;

进行这样一个小改动之后,FastMM就安静了!

但是这样的一个结论只是针对pchar类型的指针而言。

2 举一反三,数组

在Delphi中,数组分为静态数组、动态数组,静态数组的话,变量名和第一个元素名字均可以表示数组的连续内存的首地址,而对于动态数组呢,则必须明确标示元素0来标示数组分配内存的地址

procedure TForm1.btn8Click(Sender: TObject);
varMyStaticArr: array [1..10] of char;MyDynArr: array of char;
beginFillChar(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的使用方法相关推荐

  1. python字符型数据_Python基础【第五篇】:基础数据类型(字符型)

    String(字符串) 字符串的形式 在python中字符串可以用' '(单引号)," "(双引号),和''' '''(三个单引号). string1 = 'james'strin ...

  2. python 字符串常用方法

    Python 开发过程中,经常需要对字符串进行一些特殊处理,比如拼接字符串.截取字符串.格式化字符串等,这些操作无需开发者自己设计实现,只需调用相应的字符串方法即可. python 字符串分割 [ro ...

  3. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  4. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  5. Python ljust()方法

    描述 Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串.如果指定的长度小于原字符串的长度则返回原字符串. 语法 ljust()方法语法: str.ljust ...

  6. python中字符串的方法及注释

    字符串的方法及注释表: 函数 描述 capitalize() 把字符串的第一个字符改为大写 casefold() 把整个字符串的所有字符改为小写 center(width,fillchar=None) ...

  7. python字符类型的一些方法

    python 字符串和字节互转换.bytes(s, encoding = "utf8") str(b, encoding = "utf-8") i.isspac ...

  8. Python数据类型方法总结

    字符串 Python中的字符串用单引号(')或双引号(")括起来,同时使用反斜杠()转义特殊字符.下面总结一下字符串类型的常用方法. 1.isalnum():如果字符串至少有一个字符,并且所 ...

  9. Python 字符串方法详解

    Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息. 在编程中,几 ...

最新文章

  1. fc oracle,使用 CLI 配置 FC
  2. 微信小程序 RTMP 音视频 通话 ffmpeg_音视频常见问题分析和解决:HLS切片丢帧引起的视频卡顿问题排查...
  3. mysql5.5集群数据同步_[转]配置mysql5.5主从复制数据库集群
  4. mysql的配置实现远程访问_MySQL 远程连接配置的正确实现 | 学步园
  5. java三级报名_java web 学习 --第四天(Java三级考试)
  6. exchange无法收发邮件_SpringBoot2.x系列教程69--SpringBoot中整合Mail实现邮件发送
  7. 卸载java_Java面试必备——类的加载过程
  8. TCP传输的三次握手四次挥手策略
  9. 大数据+人工智能时代,电子招投标更符合未来趋势
  10. idea 打包不出现target的原因
  11. Redis复习记录(二):数据类型与基本操作
  12. 细粒度图像分类(FGVC)--- 综述
  13. 解决电脑本地网络连接显示红叉又可上网问题
  14. Teams Bot App Manifest 文件解析
  15. 大学生怎么入门Android,从一个大学生的角度打开K30PRO,以及对手机圈子的一些看法...
  16. 作为一位软件测试工程师,应当需要哪些能力?
  17. JUST技术:从GPS数据中挖掘用户行为习惯
  18. java 阿里云接口实现发送短信验证码
  19. 【pytest】pytest配置文件pytest.ini详解
  20. React基础知识 [ 新手上路学这一篇就够了 ]

热门文章

  1. Learning to Rank Proposals for Object Detection
  2. 设计立方体类(Cube)
  3. 解决fixing(d:)stage 1问题
  4. java三角套利_谈谈三角套利的策略
  5. leecode:176. 第二高的薪水
  6. 微信智能硬件应用——插座控制
  7. aac格式怎么转换成mp3?
  8. [C/C++] 显示各种C/C++编译器的预定义宏(C11标准、C++11标准、VC、BCB、Intel、GCC)
  9. SDCC 2016系列全回顾:数据库大数据运维架构(附PPT下载)
  10. PMSM矢量控制笔记(1.1)——永磁同步电机的本体结构