文档章节

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++11 提升Vector效能的技巧

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

吃一堑消化不良
2016/12/01
29
0
用好Delphi中的字符串

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

vga
2016/08/09
14
0
6 个技巧,提升 C++11 的 vector 性能

Vector 就像是 C++ STL 容器的瑞士军刀。Bjarne Stoutsoup 有一句话 – “一般情况下,如果你需要容器,就用 vector”。像我们这样的普通人把这句话当作真理,只需要照样去做。然而,就像其它...

oschina
2016/11/29
8.3K
19
Delphi、PChar和Char数组的比较

Delphi、PChar和Char数组的比较   string和Char数组都是一块内存, 其中存放连续的字符. string保存具体字符的内存对用户是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预(其实也...

技术小甜
2017/11/08
0
0
linux中Framebuffer的原理及实现机制

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

长平狐
2013/06/03
7.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
22分钟前
1
0
《读书是教师最好的修行》读后感优秀范文2200字

《读书是教师最好的修行》读后感优秀范文2200字: 作者:吴淑英;《读书是教师最好的修行》一书,收录了作者对50本经典书籍阅读后阐发的感受。作者10年来坚持每周阅读一本书,并写一篇读后感...

原创小博客
23分钟前
1
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
1
0
HashTable和Vector为什么逐渐被废弃

HashTable,不允许键值为null,还一个就是put方法使用sychronized方法进行线程同步,单线程无需同步,多线程可用concurren包的类型。 如编程思想里面说的作为工具类,封闭性做的不好没有一个...

noob_chr
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部