k:='I love Delphi!';计数器应该为1,因为刚刚分配内存,只有一个使用者
P:=@K[1];
Dec(P,2);
MyAnsiString:=@(p^);
showmessage('现在计数器:'+Inttostr(MyAnsiString^.ReferencCount));
showmessage('长度为:'+Inttostr(MyAnsiString^.Length));
j:=K;//计数器应该加1,因为j的指针指向了他,使用者又多了一个
showmessage('现在计数器:'+Inttostr(MyAnsiString^.ReferencCount));
showmessage('长度为:'+Inttostr(MyAnsiString^.Length));
j:='123';//计数器应该减1,因为j的指针指不再指向他,使用者少了一个
showmessage('现在计数器:'+Inttostr(MyAnsiString^.ReferencCount));
showmessage('长度为:'+Inttostr(MyAnsiString^.Length));
k:=j;//k的指针指向j的内容所在,那么这片数据的计数器再减去一个,即为0。
//然而因该该内存区域已经被自动释放所以这里再去读数的话就是一些随机数据
showmessage('现在计数器:'+Inttostr(MyAnsiString^.ReferencCount));
showmessage('长度为:'+Inttostr(MyAnsiString^.Length));
end;
动态数组的回收机制原理相同,现在明白了为什么动态数组再回收时要给他赋成Nil了吧!变体型等生存期自管理的
类型都是用这种机制来实现的.
为什么说字符串是动态数组的一种呢?因为以上方法同样适用于动态数组。我们用动态数组自己实现一个
AnsiString看看行不行呢?
比如:
Type
PAnsiString=^TAnsiString;
TAnsiString= record
ReferencCount:LongWord; //引用次数
Length:LongWord; //字符串长度
end;
var
k,j: array of Integer;
P:^LongWord;
MyAnsiString:PAnsiString;
begin
SetLength(k,10);//计数器应该为1,因为刚刚分配内存,只有一个使用者k
SetLength(j,10);
P:=@K[0];
Dec(P,2);
MyAnsiString:=@(p^);
showmessage('现在计数器:'+Inttostr(MyAnsiString^.ReferencCount));
showmessage('长度为:'+Inttostr(MyAnsiString^.Length));
 
上一页 [1] [2] [3] [4] [5] [6] 下一页