Delphi 的内存操作函数(1): 给字符指针分配内存


======================================================
注:本文源代码点此下载
======================================================

马上能想到的函数有:

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;

不过 strnew 存在的意义也不大, 我们可以更简单地完成上面的操作:

var

p1,p2: pchar;

begin

p1 := 'delphi';

p2 := p1;

showmessagefmt('%s, %s', [p1, p2]); {delphi, delphi}

p1 := '2009';

showmessagefmt('%s, %s', [p1, p2]); {2009, delphi}

end;

说来说去, 好像只有 stralloc 是我们值得我们记忆的?

还有一对非常重要的相关函数: globalallocptr、globalfreeptr; 它们的功能是上面这些都不可替代的!

globalallocptr 和 globalfreeptr 是对系统函数: globalalloc、globalfree 的简化, 之所以说它们重要, 只是因为它们可以跨进程操作; 不过 globalallocptr 是给无类型指针(pointer)分配内存, 当然就不仅仅用于字符指针了. 还是到后面专题再做例子吧.


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值