delphi程序片断如下:  aobj1 := TMyClass1.Create(1,2);
  aobj2 := TMyClass1.Create(3,4);
  aobj1 := aobj2;
  P1 := @aobj1;
  P2 := @aobj2;
  if P1 = P2 then
    ShowMessage('Equal');
  aobj1.Free;
  aobj2.Free;上面的代码为什么ShowMessage('Equal');从来不执行,同时,最后2句只能有一句,而如果两句都有,就出错?或者,对象变量赋值的本质是什么?
,  

解决方案 »

  1.   

    aobj1 := aobj2; 赋值过去的是指针,他们都指向同一个内存
    aobj1.Free;
     aobj2.Free;
    所以上述中有一个就够了  。
      

  2.   

    if P1 = P2 then
        ShowMessage('Equal');
    这句话比较的是地址不是内容~~
      

  3.   

    *******************************************************************
    delphi程序片断如下:  aobj1 := TMyClass1.Create(1,2);
      aobj2 := TMyClass1.Create(3,4);
      aobj1 := aobj2;
      P1 := @aobj1;
      P2 := @aobj2;
      if P1 = P2 then
        ShowMessage('Equal');
      aobj1.Free;
      aobj2.Free;上面的代码为什么ShowMessage('Equal');从来不执行,同时,最后2句只能有一句,而如果两句都有,就出错?或者,对象变量赋值的本质是什么?
    ,  
    *************************************************************
    aobj1 := aobj2;
    这句实际上是将aobj2指向了aobj1,同时你也丢失了aobj2!!!
    注意:在Delphi中所有的对象实际上都是指针!!!
    因为aobj1和aobj2都是指针,而且是不同的指针变量,所以他们在内存中的存储地址不一样,所以
    if P1 = P2 then
        ShowMessage('Equal');
    永远也执行不来了!!!P1保存的是aobj1的地址,aobj1保存的是TMyClass1对象的首地址!!!
    P2保存的是aobj2的地址,aobj2保存的是TMyClass1对象的首地址!!!你的错误在于没有理解Delphi中对象的操作!!!并且在Delphi中没有C++中的那种操作符重载的功能,所以没有办法通过=来比较两个类是否相同,你只能通过自定义的函数实现类似相等的问题!!!
      

  4.   

    大哥给你仔细讲讲:
      delphi对象变量其实是个指针(4个字节),Create后在堆中创建对象,返回其地址给对象变量
     
      aobj1 := TMyClass1.Create(1,2);
      aobj2 := TMyClass1.Create(3,4);  aobj1 := aobj2;  //aobj1 也指向了aobj2的对象,在此丢失了对TMyClass1.Create(1,2)的引用,你将不能释放它,有内存问题  P1 := @aobj1;  //p1,p2得到的是aobj1,aobj2的地址,而不是对象的地址
      P2 := @aobj2;  if P1 = P2 then  //因为aobj1,aobj2的地址不相同,所以永远不成立
        ShowMessage('Equal');
      aobj1.Free;  //aobj1 也指向了aobj2的对象,所以你对同一对象释放了两次
      aobj2.Free;  DELPHI一般不区分实际的对象与指向对象的指针(即我们所说的对象变量),所以很多人不能理解DELPHI里的对象
      

  5.   

    我这里好像ShowMessage('Equal');能执行的阿。