shaotao的历程 - 不断学习新知识

学习需要过程,而我需要一个博客来记录这个过程!

导航

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}

posted on 2009-10-18 21:32  shaotao  阅读(996)  评论(0)    收藏  举报