Delphi 的内存操作函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Delphi 的内存操作函数

马上能想到的函数有:

GetMem

AllocMem

ReallocMem

FreeMem

GetMemory

ReallocMemory

FreeMemory

New

Dispose

NewStr

DisposeStr

StrNew

StrAlloc

StrDispose

GlobalAllocPtr

GlobalFreePtr

WideStrAlloc

AnsiStrAlloc

StrDispose

Move

MoveMemory

CopyMemory

ZeroMemory

FillMemory

FillChar

StrBufSize

给字符指针(PChar、PWideChar、PAnsiChar)分配内存, 最佳选择是: StrAlloc.

StrAlloc 虽然最终也是调用了GetMem, 但StrAlloc 会在指针前面添加Delphi 需要的4 个管理字节(记录长度).

StrAlloc 分配的内存, 用StrDispose 释放, 用StrBufSize 获取大小.

用FreeMem 释放可以吗? 这样会少释放4 个字节.

这种类型的指针一般用于API 函数的参数, 譬如获取窗口标题:

var

p: PChar;

begin

p := StrAlloc(256);

GetWindowText(Handle, p, StrBufSize(p));

ShowMessage(p); {Form1}

StrDispose(p);

end;

StrAlloc 根据不同的参数(PWideChar、PAnsiChar)分别重载调用了WideStrAlloc、AnsiStrAlloc, 所以我们也可以直接使用这两个函数(这也需要用StrDispose 释放), 不过使用它们的必要性不大; 用StrAlloc 指定好参数类型即可.

给字符指针分配内存其他方法也挺方便, 譬如:

//获取 WINDOWS 所在目录

var

buf: array[0..MAX_PATH] of Char;

begin

GetWindowsDirectory(buf, Length(buf));

ShowMessage(buf); {C:\WINDOWS}

end;

数组的内存不是我们自己申请的, 系统会自动释放; 记住: 只要是手动申请的内存一定要手动释放.

我们给字符指针申请内存主要是为了在API 中接受数据, 如果我们要直接赋给常量值, 系统会自动分配内存的, 譬如:

var

p: PChar;

begin

p := '万一的 Delphi 博客';

ShowMessage(p); {万一的 Delphi 博客}

end;

当然我们也可以用这种办法申请内存, 就是笨了点, 譬如:

//获取系统目录

var

p: PChar;

begin

p := PChar(StringOfChar(Char(0), 256)); {反复一个空字符 256 次成一个字符串, 然后转为 PChar}

GetSystemDirectory(p, StrBufSize(p));

ShowMessage(p); {C:\WINDOWS\system32}

end;

如果在API 函数需要的字符指针是为了输入, 当然也不需要申请内存, 譬如:

//设置窗口标题

var

p: PChar;

begin

p := '窗口新标题';

SetWindowText(Handle, p);

end;

//也可以直接给常量

begin

MessageBox(Handle, '提示信息', '标题', MB_OK);

end;

//如果是给字符串的变量或常量, 则需要转换一下

var

str: string;

begin

str := '万一的 Delphi 博客';

TextOut(Canvas.Handle, 10, 10, PChar(str), Length(str));

{在窗体上输出文字, 此代码不能在 OnCreate 事件中}

end;

跑题了...到现在已用到了StrAlloc、StrDispose、WideStrAlloc、AnsiStrAlloc、StrBufSize 几个函数.

还有NewStr、DisposeStr、StrNew、StrDispose 也貌似有点关系.

先说NewStr 和DisposeStr(它们是一对);

NewStr 是根据AnsiString 再新建一个PAnsiString, 不过这是为兼容而存在的, Delphi 已不提倡使用了.

不再提倡使用的函数都缀以deprecated 标识, 并在代码提示中用灰色显示.

其实用@ 即可获取字符串指针, 当然根本用不着它们.

还有个StrNew; StrNew 可以再制一个相同的字符指针, 譬如:

var

p1,p2: PChar;

begin

p1 := 'Delphi';

p2 := StrNew(p1);

ShowMessageFmt('%s, %s', [p1, p2]); {Delphi, Delphi}

p1 := '2009';

ShowMessageFmt('%s, %s', [p1, p2]); {2009, Delphi}

StrDispose(p2); {释放自己申请的}

end;

相关文档
最新文档