问题一:
A := TA.Create;在内存中创建的对象的头4个字节到底指向哪?
在《参透Delphi》一书中说是指向:VMT。
在《Delphi对象模型》中说:
在Delphi中,类表现为内存中一张只读的表,表中存放着指向该类的虚方法的指针以及其他许多信息。
创建的对象的头4个字节存放的是一个类引用(Class reference)就是指向该表的一个指针,而该表的头4个字节又是一个指向VMT的指针。//哪 一个是正确的,或者是我自己理解错了吗?

解决方案 »

  1.   

    A指向对象的地址
    内存中创建的对象的头4个字节到底指向VMT
      

  2.   

    》》而该表的头4个字节又是一个指向VMT的指针。
    这个应该是父类的VMT~~
      

  3.   

    》》而该表的头4个字节又是一个指向VMT的指针。
    这个应该是父类的VMT~~这是我的理解:)应该是指向自己的VMT
      

  4.   

    〉〉在Delphi中,类表现为内存中一张只读的表,表中存放着指向该类的虚方法的指针以及其他许多信息。
    ---------好像这句不恰当〉〉创建的对象
    ---------A指针〉〉头4个字节存放的是一个类引用(Class reference)就是指向该表的一个指针
    ---------指向TA的头四字节而该表的头4个字节又是一个指向VMT的指针。
      

  5.   

    根据我使用下来,还是不要去理解DELPHI的内存分配,DELPHI的内存管理好象很糟糕如定义TParentClass = class
    public
        function GetName(); virtual; abstract;
    end;TChildClass1 = class( TParentClass )
    public
        function GetName(); override;
    end;TChildClass2 = class( TParentClass)
    public
        function GetName(); override;
    end;
    有功能var
       t: TParentClass;   t := TChildClass1.Create;   ShowMessage( TChildClass2(t).GetName() );运行时不会出错,但是程序经常会莫名其妙的出错
    结论,知道所有的类都是传引用的就行了,不要多管,知道也没有什么好处
      

  6.   

    <参透Delphi>说的是正确的
    <对象模型>说的不正确
    对象创建以后,是分两个部分存放的
    一个部分是栈上的对象指针
    另外一个部分是堆上的对象实体栈上的对象指针指到堆上的对象实体的内存首地址
    对于堆上的对象实体,里面只是存放可读写信息,因此一般是属性内容,至于方法则是放在类的VMT的(类的VMT也存放在堆上,位置应该是在对象实体之前,这个可以写个简单的代码测试一下).堆上对象实体的头四个字节指向类的VMT的堆内存首地址,所以可以认为是一个类引用类型的变量(Delphi的类引用类型就是如此在内存中实现的).对于类的VMT是一个指针表,其中存放的是类信息和类实现或申明的方法信息,都是只读信息.明白?
      

  7.   

    "而该表的头4个字节又是一个指向VMT的指针。"这个说法是说类的VMT的头四个字节指向了另外一个类的VMT内存地址,这个被指向的类应该是当前类的Parent.更正一下,两种说法完全一致,都正确.
      

  8.   

    To WarmWorm  不知道这个朋友因何根据Delphi的对象模型而置疑Delphi的内存管理?
      各种支持OO的语言的对象模型都大同小异,为了支持OO而设计相对应的内存模型.至于内存管理,无论是结构类型还是简单类型各种语言在实现上也没有多大的区别.如果涉及内存回收问题,新型的.net和Java当然做的比传统的OOL要好很多,自动化程度更高,但无论是对于基于引用计数的结构类型还是简单类型内存的管理,个人感觉Delphi比没有什么特别逊色的地方.
      

  9.   

    头4个字节存放的是一个类引用(Class reference)其实这个类引用就是指向类的VMT的堆内存首地址的指针,也许就是说法上的不同,并不是我们以前认为的是类在内存中那个只读表的首地址!FS:)
      

  10.   

    对象中肯定有指向类的内存地址的信息,否则通过对象调用方法无法实现.....类中也必须有指向父类的信息,否则Inherited无法实现,类继承也无法实现.....
      

  11.   

    一个类不需要去关心他父类的vmt吧..而且vmt
    ...
    -4 Pointer entry point of Destroy destructor
    0 Pointer entry point of first user-defined virtual method
    4 Pointer entry point of second user-defined virtual method
    ... ... ...
      

  12.   

    To JinJazz  类的VMT里面有个Field是放的Parent的信息,例如类TA,可以通过类型转换和TA.Parent直接访问父.
      

  13.   

    对象实例在内存中的头4个字节是指向“当前它引用构造方法那个类的VMT地址的”
    而一个类在内存中的实体就是那个只读表,表的头4个字节应该是指向类本身的VMT的。FS说的:
    对象中肯定有指向类的内存地址的信息,否则通过对象调用方法无法实现.....
    ...应该是通过对象的其他部分指向的,应该不是头4个字节。类中也必须有指向父类的信息,否则Inherited无法实现,类继承也无法实现.....
    ...在类表中有指向类类的指针
      

  14.   

    To  FrameSniper(someone had told me tomorrow will be bright.....)我的核心意思是DELPHI自行进行的内存管理
    我所举的例子很明显是由DELPHI所主持下的内存管理
    如果是自己写的内存方面的程序,我相信自己没有什么问题至于为什么写得有火气,是因为我因为这个问题查程序查了一个星期才查出来
    仅仅是因为内存的越界的访问,而使程序扔出内存异常(程序运行时不出错,整个程序关闭时才会出错),不信你自己试试ps: 你的水平还行,问几个问题
    1 DELPHI的IDE中是不是带有内存检测?至少是最常规的内存泄漏检测?(调试环境下)
    用BoundsCheck检太麻烦了
    2 TTcpClient 在连接出错后,会有内存泄漏(Delphi 6.0),能不能把这些内存找出来释放掉
    (主要是做断线重连的程序)
      

  15.   

    -76 Pointer pointer to virtual method table (or nil)
    -72 Pointer pointer to interface table (or nil)
    -68 Pointer pointer to Automation information table (or nil)
    -64 Pointer pointer to instance initialization table (or nil)
    -60 Pointer pointer to type information table (or nil)
    -56 Pointer pointer to field definition table (or nil)
    -52 Pointer pointer to method definition table (or nil)
    -48 Pointer pointer to dynamic method table (or nil)
    -44 Pointer pointer to short string containing class name
    -40 Cardinal instance size in bytes
    -36 Pointer pointer to a pointer to ancestor class (or nil)
    -32 Pointer pointer to entry point of SafecallException method (or nil)
    -28 Pointer entry point of AfterConstruction method
    -24 Pointer entry point of BeforeDestruction method
    -20 Pointer entry point of Dispatch method
    -16 Pointer entry point of DefaultHandler method
    -12 Pointer entry point of NewInstance method
    -8 Pointer entry point of FreeInstance method
    -4 Pointer entry point of Destroy destructor
    0 Pointer entry point of first user-defined virtual method
    4 Pointer entry point of second user-defined virtual method--
     类的VMT里面有个Field是放的Parent的信息,例如类TA,可以通过类型转换和TA.Parent直接访问父.--
    了解了
      

  16.   

    -76 Pointer pointer to virtual method table (or nil)
    指向自己的VMT,就是SELF
      

  17.   

    To WarmWorm  Sorry,辜负你的夸奖了,你的问题我一个也回答不了.....To 阿风  “对象实例在内存中的头4个字节是指向“当前它引用构造方法那个类的VMT地址的”
    而一个类在内存中的实体就是那个只读表,表的头4个字节应该是指向类本身的VMT的。”——这个话是错误的,类中没有指向自己的的信息域!要这样内容的域没有任何实际意义。内存很宝贵!“FS说的:
    对象中肯定有指向类的内存地址的信息,否则通过对象调用方法无法实现.....
    ...应该是通过对象的其他部分指向的,应该不是头4个字节。类中也必须有指向父类的信息,否则Inherited无法实现,类继承也无法实现.....
    ...在类表中有指向类类的指针”你又错了,对象的头四个字节就是指向类的VMT的,类似CPP对象模型中的VPTR。
    我不明白什么叫“类类的指针”,DELPHI之所以这样设计类的内存布局,原因很简单,充分实现代码复用。而代码复用是OO的继承特性所强调的,所以这样设计是为了直接支持OO,是使DELPHI成为OOL的必要条件。
      

  18.   

    nod Shiyl(云淡风清 卷舒自在)
    很难的看到FS这厮“务点正事”。
    不打扰他的雅兴了,FS继续:)