Delphi之字符串


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

ansistring类型是object pascal的缺省字符串类型,等同于string。同时它也是生存期管理类型,具有动态内存分配和垃圾自动回收功能,

object pascal也会自动地管理临时串的内存分配工作。另外,ansistring类型总是以null结尾,从而和win32 api中的null结尾字符串兼容。

ansistring的内存分配情况:

ansistring是引用计数类型,字符串之间赋值仅仅做指针拷贝操作,它们共享相同的物理内存地址。同时delphi内存管理器使用copy-on-write技术,

只有在修改了某个字符串时,delphi才释放掉这个引用,并且为修改后的字符串申请新的物理内存地址。当我们声明一个ansistring变量时,它是没有长度的,

因此字符串没有为字符申请内存空间。为了申请字符串的内存空间,我们可以给它赋值为一行字符或者另一个字符串变量,也可以使用setlength()函数。

var

str: string;

s: string;

begin

str := 'delphi';

s[1] := 'd';//错误,s此时还没有申请内存空间。

s := 'delphi'; //或者s := str; 或者setlength(s, 4);

end;

ansistring类型总是null结尾,因此兼容null结尾的字符串。这使我们调用win32 api函数或其他需要pchar类型字符串的函数变得很方便。

我们在调用时进行强制类型转换pchar(s),或者@s[1]。(s[1]是字符串s的第一个字符,@是取地址。s[0]存放的是字符串s的长度)。

widestring类型由widechar字符组成。它用于兼容unicode字符,它也是生存期管理类型,所不同的是widestring赋值时,是把整个串从一个地方

拷贝到另一个地方。这使得widestring在速度和内存使用上性能不如ansistring!

pchar是以null(#0)结尾的字符串指针,与ansistring和widestring的内存分配不同,pchar不是自动分配和管理内存的。所以,

我们必须自己使用内存分配函数给pchar所指向的字符串分配内存。如:

var

p: pchar;

begin

p := stralloc(32*sizeof(char));//当然还有很多其他的字符串指针内存分配函数。如getmem();等。详细可参考万一博客

strpcopy(p1, 'delphi 2007');

strdispose(p1);

end;

在应用pchar时多数情况是,首先给它分配内存,然后将它传入函数以接受返回值。而在其他大部分情况下。ansistring类型可以被当作pchar使用;

因此我们都是尽可能多用ansistring,而不是用pchar。因为ansistring的内存管理是自动执行的。从而避免手动给pchar分配内存,尤其是释放内存,

不然就会出现内存泄漏;在debug下开启内存泄漏:

{$ifdef debug}

reportmemoryleaksonshutdown := true; //插入到应用程序入口的begin语句下。

{$endif}


======================================================
在最后,我邀请大家参加新浪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、付费专栏及课程。

余额充值