文档章节

Delphi 的内存操作函数(4): 清空与填充内存

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 411
阅读 5
收藏 0

FillMemory、ZeroMemory 一目了然的两个函数, 但其实它们都是调用了 FillChar;

清空不过就是填充空字符(#0: 编号为 0 的字符), 说来说去是一回事.

为了下面的测试, 先写一个以十六进制方式查看内存的函数:
function GetMemBytes(var X; size: Integer): string;
var
  pb: PByte;
  i: Integer;
begin
  pb := PByte(X);
  for i := 0 to size - 1 do
  begin
    Result := Result + IntToHex(pb^, 2) + #32;
    Inc(pb);
  end;
end; {GetMemBytes end}

//测试:
var
  p1: PAnsiChar;
  p2: PWideChar;
  s1: AnsiString;
  s2: UnicodeString;
begin
  p1 := 'ABCD';
  p2 := 'ABCD';
  s1 := 'ABCD';
  s2 := 'ABCD';

  ShowMessage(GetMemBytes(p1,4)); {41 42 43 44}
  ShowMessage(GetMemBytes(p2,8)); {41 00 42 00 43 00 44 00}
  ShowMessage(GetMemBytes(s1,4)); {41 42 43 44}
  ShowMessage(GetMemBytes(s2,8)); {41 00 42 00 43 00 44 00}
end;

 
 
 
 
 

 

 

  

测试 FillMemory、ZeroMemory、FillChar 三个填充函数:
const
  num = 10;
var
  p: PChar;
begin
  p := StrAlloc(num);

  ShowMessage(GetMemBytes(p, num)); {从结果看出 StrAlloc 没有初始化内存}

  FillMemory(p, num, Byte('A'));
  ShowMessage(GetMemBytes(p, num)); {41 41 41 41 41 41 41 41 41 41}

  ZeroMemory(p, num);
  ShowMessage(GetMemBytes(p, num)); {00 00 00 00 00 00 00 00 00 00}

  FillChar(p^, num, 'B');
  ShowMessage(GetMemBytes(p, num)); {42 42 42 42 42 42 42 42 42 42}

  StrDispose(p);
end;

 
 
 
 
 

 

 

  

此时, 我想到一个问题:
GetMem 和 GetMemory 没有初始化内存; AllocMem 会初始化内存为空, 那么
ReallocMem、ReallocMemory 会不会初始化内存?
测试一下(结果是没有初始化):
{测试1}
var
  p: Pointer;
begin
  p := GetMemory(3);
  ShowMessage(GetMemBytes(p, 3));
  ReallocMem(p, 10);
  ShowMessage(GetMemBytes(p, 10)); {没有初始化}
  FreeMemory(p);
end;

{测试2}
var
  p: Pointer;
begin
  p := AllocMem(3);
  ShowMessage(GetMemBytes(p, 3));
  ReallocMem(p, 10);
  ShowMessage(GetMemBytes(p, 10)); {没有初始化}
  FreeMemory(p);
end;

 
 
 
 
 

 

 

  

另外: FillMemory、ZeroMemory 的操作对象是指针, 而 FillChar 的操作对象则是实体.

本文转载自:http://www.cnblogs.com/del/archive/2008/11/14/1333425.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
使用C/Delphi编写ShellCode

来源:http://www.bootkitz.com/?p=93 文章谈的很好 这里说的ShellCode指的是一段x86机器码,无需重定位,在内存任何位置都可以执行的代码. 使用C/Delphi编写代码也是由其编译器特性决定的。...

BlAckEagle
2013/01/21
0
5
C++11 提升Vector效能的技巧

(1)提前分配足够的空间以避免不必要的重新分配和复制周期 这个情况在 Scott Meyers 的书中得到了很好的解释,这本书叫 Effective STL-50条有效使用STL的经验: 对于 vector 和 string,在需...

吃一堑消化不良
2016/12/01
29
0
在ActiveX控件中如何动态调用DLL函数

刚到公司不久,接到领导的下达的一个任务,就是把对POS机操作功能封装在ActiveX控件中,在IE中调用。这样就能实现在IE上直接对POS机进行操作。而我要封装的这个动态库,厂家只提供了一个单的动...

晨曦之光
2012/03/09
0
0
linux中Framebuffer的原理及实现机制

linux中Framebuffer的原理及实现机制 一、FrameBuffer的原理 FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。 Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡B...

长平狐
2013/06/03
6.7K
0
用好Delphi中的字符串

用好Delphi中的字符串日期:2005年10月18日 作者: 人气:17184 查看:[大字体 中字体 小字体]一:各种字符串  字符串是Object Pascal所有数据类型中最有用的类型。许多函数以字符串为传递参...

vga
2016/08/09
14
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

谷歌 Fuchsia 上手体验,将取代Android/win10

在手机市场领域,Google表现很抢眼,毫无疑问,Android 至今在移动操作系统的市场份额占据绝对领先地位,但是 Android 仍然存在不少问题,碎片化问题严重,在平板以及大屏幕设备上表现糟糕,...

linux-tao
22分钟前
1
0
List、Array与ArrayList

数组在内存中是连续存储的,所以它的索引速度很快,而且赋值和修改元素也非常快,比如: string[] s=new string[3];//赋值 s[0]="a"; s[1]="b"; s[2]="c";//修改 s[1]="b1"; 但是数组...

shimmerkaiye
24分钟前
0
0
Linux 的Lnmp环境下为mysql添加环境变量

一.问题 在Linux 安装完Lnmp 环境后 , 连接Mysql 告诉没有这条命令 mysql -uroot -p 命令失效 因为是源码安装的,所以会出现这样的的原因 。集成环境是不会出现的。 其实很简单,只需要给m...

15834278076
26分钟前
3
0
apolloxlua include函数

include函数不是单独使用的函数, 他并不是标准库的一部分, 你可以使用include函数将某个后缀为 .aop的文档包含到你的文档流中。 因为include是单独处理流, 所以不会在主处理流程中有所表示...

钟元OSS
30分钟前
0
0
【转载分享】做一名较真的工程师

近些年与我共事过的同事,一定知道我至今仍有一个较真的性格。我会:指出同事所写代码的不当命名问题(并帮助改进);指出同事所写文档中的逻辑混乱问题(并辅以修订);指出同事所写PPT中乱...

HellerZhang
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部