======================================================
注:本文源代码点此下载
======================================================
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^)/