A,B:TNode;//TNode是一个类
begin
  B:=TNode.Create;
  对B节点做一些的事情
  A := B;
  B.Free;
End;
那么A中存放的是不是只是一个指向B的指针,还是A就是B的另外一个副本?
也就是说B释放掉以后,A内的内容是是原来B的内容,或者不是?我感觉A应该是指指针。
可是我在程序中
function TPriorityQueueLink.DeleteMin: TNode; 
var
  TempCell:PTCell;
begin
  TempCell := Head^.Next;
  Head^.Next := TempCell^.Next;
  result := TempCell^.Node;
  Dispose(TempCell);//加不加这句都不会出错
end;
因为我在程序中使用到了result的值,所以奇怪觉得为什么不会出错。难道":="运算法可以对把一个对象赋给另外一个对象?

解决方案 »

  1.   

    注意这里A并没有create.
      PTCell = ^TCell;
      TCell = Record
        Node:TNode;//TNode是一个类
        Next:PTCell;
      end;
    顺便问一下,这里为什么不能修改帖子?
      

  2.   

    A := B;
    则A中存放的只是一个指向B的指针;
    B释放了,A只是一个无用的指针了。
      

  3.   

    可是我的A是TNode型啊,又不是 ^TNode 型。怎么会是指针呢?
      

  4.   

    A,B:TNode;//TNode是一个类
    A是一个类TNode的实例,A就是一个指针,类的对象都是指针。
      

  5.   

    你要用,Delphi对象中的Assign方法,就可以了
      

  6.   

    在delphi中说明为class的类变量实际上都是指针,如果要说明为非指针就要用以前的方法说明为object,不过即使对象变量不是指针这样赋值也没什么意义,因为成员变量还有不少是指针或句柄,这样赋值同样没什么意义。
      

  7.   

    楼主研究一下VMT和DMT就应该明白了
      

  8.   

    通过Assign方法,不过这个方法是一个虚方法,如果是做数据库的话,用DELPHI控件的话里面的一些方法要进行赋值,要不就自己重载一下Assign方法,自己写里面的赋值就行了。很简单的。
      

  9.   

    楼主的意思好像是说
    Dispose(TempCell);//加不加这句都不会出错
    这一句话为什么不出错!
    如果你再一次使用Head^.Next.Node,应该会报异常!
    Head^.Next := TempCell^.Next;
    result := TempCell^.Node;
    Dispose(TempCell);//加不加这句都不会出错
    result:=Head^.Next.Node;//这里应该就会报无效地址异常了!