如果只是 a := b,那么它就只是传址,并给 b加一个引用量。
解决方案 »
- 婆家婆 主界面是用什么控件
- windows的搜索程序具体路径在哪?
- 我的程序在运行的时候会调用一个批处理文件,我怎么监视这个程序退出.
- 如何用代码实现控制某控件的滚动条的移动,如上移或下移,鼠标的滚动滑轮滚动时会触发什么事件?
- 怎样写重载的函数?
- Delphi如何调用VB的OCX?
- 一个canvas 上连续的,画两块不同的图形竟然是。画一样的图形那位高手看看
- 日期型的如何写
- 怎样用Delphi发邮件(在smtp需要验证的情况下)
- : Danny_Yuan(小丹尼) 在线吗?
- (MDI)如何在父窗体上面点击一个button了以后,destory所有的子窗体(除了一个指定的caption)
- 关于数据备份问题,大侠请进!
当改变量超出其作用域时,减少引用计数当
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;
DELPHI内部处理为指针拷贝,
只有在这两个变量有一个发生改变后,
DELPHI才为这个变量分配新的空间。