Delphi之字符串
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}
浙公网安备 33010602011771号