procedure changevariant(s:string)
var 
  v:variant
begin
  v:=s;
  Tvardate(v).vtype:=varinteger;
  tvardate(v).vinteger:=32;
  v:=34;
end;
为什么说这样影响到了DELPHI给字符串S的引用计数减1,关键是DELPHI怎样对字符串
进行引用计数的在什么地方记录,怎样管理的,还请各位朋友帮帮忙!!!!!

解决方案 »

  1.   

    v:=s;  //这里开始增加引用计数
      Tvardate(v).vtype:=varinteger; //这里强制改变v的实际类型导致以后不能减少引用计数
      tvardate(v).vinteger:=32;
      v:=34; //正常情况下这里会导致减少引用计数,但由于上面强制把类型改为整型,所以编译器以为原来的实际类型并不是字符串,所以不会减少引用计数引用计数是放在字符串指向的内存偏移-8的地方,而且是由编译器自动管理的。
      

  2.   

    可以改变,因为引用计数是放在字符串指向的内存偏移-8的地方用下面代码就可以改变s:string;
    p:PInteger;p:=s;
    dec(p,2);
    inc(p^,4);这样就把s的引用计数增加4,要注意几点
    如果引用计数是-1那么就不要改变,这用字符串是常量字符串
    WideString没有引用计数
    最后说一下没有什么必要不要手工去改变引用计数,这样做很危险。