我认为Delphi真正的对象在哪里,或者对象的起始地址是多少,我实在没法知道的!
如果诸位可以找到对象真正地址请告知我,谢谢!说明如下:设有如下类定义:
TMyClass = Class(TObject)
public
  Value: Integer;
end;定义:
Var
  MyClass: TMyClass;  MyClass 其实是一个指针, TMyClass.Create返回对象真正的地址
 执行MyClass := TMyClass.Create;后,MyClass指针指向一个对象  而@MyClass得到的只是MyClass指针变量的地址,而对象的地址无法得到 我没有求过@TMyClass.Create,也许能得到一个地址,请继续讨论,谢谢

解决方案 »

  1.   

    对不起,我可能错了,请问Pointer(MyClass)是对象的真正地址吗?我觉得很可能是,
      

  2.   

    @myclass就是他的地址。此时myclass是该Tmyclass的一个实例,不是一个指针。
      

  3.   

    呵呵,不是狠了解楼主的确切含义:)
    如果将TMyClass.Create翻译成汇编的话,应该是call [TMyClass] 
    其实就是将IP指向TMyClass.Create的地址,你可以通过这个时候的寄存器的值获得上面的问题?
      

  4.   

    问 caohonglong2000(chl):有下列代码:
    A := TClass.Create();
    A.X:=100;
    B := A;
    B.X := 101;此时A.X 的值是多少?答案是101;因此A和B是同一个对象
    如@A,@B是对象地址的话?那么@B=@A,事实是@B<>@A, 而Pointer(A) = Pointer(B);
    所以Pointer(A) Pointer(B).才是对象的地址
      

  5.   

    对于:delphijoe(delphijoe)从MyClass := TMyClass.Create语句看,把Create看成有返回值的Function的话
    而把MyClass看成一个指针,MyClass变量的内容看成是TMyClass.Create创建对象的地址当然这种看法是不一定正确,
    @TMyClass.Create的值是函数的地址,而不是新创建对象的地址
      

  6.   

    我的结论如下:TMyClass = Class(TObject)
    public
      Value: Integer;
    end;
    PMyClass: ^TMyClass;var MyClass: TMyClass;
        PClass: PMyClass;
    MyClass := TMyClass.Create;观点有三个:
      1.MyClass是一个指针,但不是PMyClass类型;
     2.MyClass变量的值是Pointer(MyClass),是一个32位地址
     3.Pointer(MyClass)是TMyClass.Create创建对象的起始地址 4.关于PMyClass类型的意义,我暂时还无法准确说明,
      大概意义是: PMyClass类型变量,指向一个MyClass之类的变量
      不管怎么结果是下正确的
        PClass指向MyClass,则PClass的值是@MyClass,也就是说Pointer(PClass) = @MyClass
      

  7.   

    NND,两次的回复都写反了,害的我自己删除了两次自己的帖子....郁闷....var
      Obj:TObject;
    begin
      Obj:=TObject.Create;
      Format('对象指针在栈上地址:%s',[Integer(Addr(Obj))]);
      Format('对象实体在堆上地址:%s',[Integer(Pointer(Obj))]);
      //对象指针的释放形式隐含了^操作符....
    end;
      

  8.   

    FrameSniper(§绕瀑游龙§) 请问高手,
    @Node         = $12F544
    Pointer(Node) = $12F68C
    Addr(Node)    = $12F544能不能帮我解释一下,上面三个值的意义?
      

  9.   

    呵呵,谢谢版主,这样子,  Format('对象指针在栈上地址:%s',[Integer(Addr(Obj))]);
      Format('对象实体在堆上地址:%s',[Integer(Pointer(Obj))]);这样我就明白了,
    @Obj = Addr(Obj),意义相同对吗?
      

  10.   

    @和Addr的作用是一样的,都是获取变量地址所以当他们用在对象指针上的时候就是获取这个指针变量的地址,而这个地址是在栈空间上对象指针的地址....对于对象指针,实际上我们平时通过这个指针来获取对象数据成员(存在与堆上对象实体空间中)的时候和普通指针一样,首先要指针变量进行释放,然后才可以访问指针所指内容,例如
    假设有指针如下
    var
      P:Pointer;
    我通过这个指针访问的时候应该是这样的P^,其实对象指针也一样,按照常规,我们在使用Obj这个对象指针的时候也应该使用Obj^,但由于Object Pascal对纯Pascal进行了扩充,所以这里不再需要^,而直接使用旧可以了,从这个意义上说Obj本身就代表一个指针释放,释放的结果就是Obj这个对象指针变量中包含的指针,而这个指针就是对象实体在堆上的地址!
    (所以,我上面那个Pointer都没有必要加,呵呵....)
      

  11.   

    程序的内存分配包括了两部分 堆/栈
    其中一个是属于运行期分配动态内存分配的
    C++和Delphi的在对象的管理不同之一就在这里,C++可以有对象变量,而Delphi只能有对象的引用,换句话说,Delphi的所有的对象和其他的基本类型的内存管理都不同,我们定义的对象变量都是一个指针,在程序运行的时候通过显示的调用其构造函数来分配内存。但是对象所拥有的方法(过程、函数)的地址有不同,每个类实例也就是对象并没有包含方法的地址(也许Delphi会有不同,但是因该和C++的也差不多),实际上每个对象只包含了一个函数列表指针,这个指针指向的地址包含了函数地址。也就是说不论是哪个对象,他们的函数的地址都是一样的,因为这个只有一份
      

  12.   

    Borland/delphi7/source/vcl 看看就知道了
      

  13.   

    每个类都有,所有的类,如果不指明继承关系,那么默认都是TObject子类
    TA = class
    end;
    等于
    TA = class(TObject)
    end;