如果只是 a := b,那么它就只是传址,并给 b加一个引用量。

解决方案 »

  1.   

    传递指针,并增加原来串的引用计数
    当改变量超出其作用域时,减少引用计数当
    var
      s: string;procedure TForm1.Button1Click(Sender: TObject);
    var
      s1: string;
    begin
      s := 'gyb';
      s1 := s;
      ShowMessage(s1);
    end; s1 := s编译器就执行了
    procedure _LStrLAsg(var dest; const source);
    {$IFDEF PUREPASCAL}
    var
      P: Pointer;
    begin
      P := Pointer(source);
      _LStrAddRef(P);
      P := Pointer(dest);
      Pointer(dest) := Pointer(source);
      _LStrClr(P);
    end;
    这个过程
    其中dest即为s1, Source即为s上面是用于分配局部变量分配全局变量,具体也没看懂,呵procedure _LStrAsg(var dest; const source);
    {$IFDEF PUREPASCAL}
    var
      S, D: Pointer;
      P: PStrRec;
      Temp: Longint;
    begin
      S := Pointer(source);
      if S <> nil then
      begin
        P := PStrRec(Integer(S) - sizeof(StrRec));
        if P.refCnt < 0 then   // make copy of string literal
        begin
          Temp := P.length;
          S := _NewAnsiString(Temp);
          Move(Pointer(source)^, S^, Temp);
          P := PStrRec(Integer(S) - sizeof(StrRec));
        end;
        InterlockedIncrement(P.refCnt);
      end;  D := Pointer(dest);
      Pointer(dest) := S;
      if D <> nil then
      begin
        P := PStrRec(Integer(D) - sizeof(StrRec));
        if P.refCnt > 0 then
          if InterlockedDecrement(P.refCnt) = 0 then
            FreeMem(P);
      end;
    end;
      

  2.   

    如果是string类型,
    DELPHI内部处理为指针拷贝,
    只有在这两个变量有一个发生改变后,
    DELPHI才为这个变量分配新的空间。
      

  3.   

    string这个类型有一个引用记数,每次赋值给其他时加一,就是说多个变量赋同一个string,它们都指想同一个地址,但是其中一个变量改变的话,就会把改变后的string存到另一个地址,让这个变量指向它,同时原来的string记数减一