在object pascal中,string(准确的说是ansistring)是一种可变长度的字符串,通过pchar(astring)可以将其转换为与windows api相兼容的字符指针类型。事实上,string类型就是一个指针,你可以用sizeof去读取它的大小,不论字符串的实际长度是多少,sizeof(astring)永远是4。string与一般的null-terminated字符指针不同的是,string还要保留另外的一部分空间,用于记录字符串长度和引用计数等信息。string类型在内存中的确切格式如下:
(4字节)分配大小+(4字节)引用计数+(4字节)字串长度+(不定长)字符数组+(1字节)$0结束字符
为了验证这一点,我们可以在程序中添加一个作用域为private的string变量,在程序中动态改变它的长度和内容,同时观察它的分配大小和长度发生了什么变化。另外,为了观察引用计数的变化,只有在两个字符串互相复制的时候才能体现出来,我们在程序中也要实现这一点。
请新建一个application,在窗体上放置一个edit,一个listbox和三个button。其中,edit用来改变字符串的内容;listbox用来记录跟踪信息;三个按钮分别用于观察字符串的当前状况,观察字符串的引用计数变化情况和清空列表内容。
在form的声明中添加一个变量:
type
tform1=class(tform)
...
private
s : string;
end;
添加三个按钮的事件处理如下:
procedure tform1.button1click(sender: tobject);
var
psz : pchar;
pdw : pdword;
dw1, dw2, dw3 : dword;
begin