怎么理解对象在内存中的头4个字节

hottey 2004-11-02 03:26:00
问题一:
A := TA.Create;在内存中创建的对象的头4个字节到底指向哪?
在《参透Delphi》一书中说是指向:VMT。
在《Delphi对象模型》中说:
在Delphi中,类表现为内存中一张只读的表,表中存放着指向该类的虚方法的指针以及其他许多信息。
创建的对象的头4个字节存放的是一个类引用(Class reference)就是指向该表的一个指针,而该表的头4个字节又是一个指向VMT的指针。

//哪 一个是正确的,或者是我自己理解错了吗?
...全文
352 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrameSniper 2004-11-03
  • 打赏
  • 举报
回复
To WarmWorm

Sorry,辜负你的夸奖了,你的问题我一个也回答不了.....

To 阿风

“对象实例在内存中的头4个字节是指向“当前它引用构造方法那个类的VMT地址的”
而一个类在内存中的实体就是那个只读表,表的头4个字节应该是指向类本身的VMT的。”——这个话是错误的,类中没有指向自己的的信息域!要这样内容的域没有任何实际意义。内存很宝贵!

“FS说的:
对象中肯定有指向类的内存地址的信息,否则通过对象调用方法无法实现.....
...应该是通过对象的其他部分指向的,应该不是头4个字节。

类中也必须有指向父类的信息,否则Inherited无法实现,类继承也无法实现.....
...在类表中有指向类类的指针”

你又错了,对象的头四个字节就是指向类的VMT的,类似CPP对象模型中的VPTR。
我不明白什么叫“类类的指针”,DELPHI之所以这样设计类的内存布局,原因很简单,充分实现代码复用。而代码复用是OO的继承特性所强调的,所以这样设计是为了直接支持OO,是使DELPHI成为OOL的必要条件。
year2000bug 2004-11-03
  • 打赏
  • 举报
回复
study
dyh506 2004-11-03
  • 打赏
  • 举报
回复
学习先
nyf1220 2004-11-03
  • 打赏
  • 举报
回复
FS,继续啊
zzzxxxcccvvv 2004-11-03
  • 打赏
  • 举报
回复
firetoucher 2004-11-03
  • 打赏
  • 举报
回复
nod Shiyl(云淡风清 卷舒自在)
很难的看到FS这厮“务点正事”。
不打扰他的雅兴了,FS继续:)
Shiyl 2004-11-03
  • 打赏
  • 举报
回复
学习了,难得看到FS讲课了


----------------------------------------------------------------
花自飘零水自流,一种相思,两处闲愁。
此情无计可消除,才下眉头,又上心头。
----------------------------------------------------------------
WGYKING 2004-11-03
  • 打赏
  • 举报
回复
学习
嘿嘿~~
beyondtkl 2004-11-03
  • 打赏
  • 举报
回复
MK.
computerstarveling 2004-11-02
  • 打赏
  • 举报
回复
两种说法说的是一个意思.
yxzzjg 2004-11-02
  • 打赏
  • 举报
回复
mark
WGYKING 2004-11-02
  • 打赏
  • 举报
回复
-76 Pointer pointer to virtual method table (or nil)
指向自己的VMT,就是SELF
longtusoft 2004-11-02
  • 打赏
  • 举报
回复
高级问题,学习一把
jinjazz 2004-11-02
  • 打赏
  • 举报
回复
-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直接访问父.

--
了解了
WGYKING 2004-11-02
  • 打赏
  • 举报
回复
呵呵
关于越界访问,应该只能自己控制了
关于内存泄漏,自己项目里写一个相对应的垃圾回收器也不是什么难事
warmworm 2004-11-02
  • 打赏
  • 举报
回复
To FrameSniper(someone had told me tomorrow will be bright.....)

我的核心意思是DELPHI自行进行的内存管理
我所举的例子很明显是由DELPHI所主持下的内存管理
如果是自己写的内存方面的程序,我相信自己没有什么问题

至于为什么写得有火气,是因为我因为这个问题查程序查了一个星期才查出来
仅仅是因为内存的越界的访问,而使程序扔出内存异常(程序运行时不出错,整个程序关闭时才会出错),不信你自己试试

ps: 你的水平还行,问几个问题
1 DELPHI的IDE中是不是带有内存检测?至少是最常规的内存泄漏检测?(调试环境下)
用BoundsCheck检太麻烦了
2 TTcpClient 在连接出错后,会有内存泄漏(Delphi 6.0),能不能把这些内存找出来释放掉
(主要是做断线重连的程序)
hottey 2004-11-02
  • 打赏
  • 举报
回复
对象实例在内存中的头4个字节是指向“当前它引用构造方法那个类的VMT地址的”
而一个类在内存中的实体就是那个只读表,表的头4个字节应该是指向类本身的VMT的。

FS说的:
对象中肯定有指向类的内存地址的信息,否则通过对象调用方法无法实现.....
...应该是通过对象的其他部分指向的,应该不是头4个字节。

类中也必须有指向父类的信息,否则Inherited无法实现,类继承也无法实现.....
...在类表中有指向类类的指针
FrameSniper 2004-11-02
  • 打赏
  • 举报
回复
To JinJazz

类的VMT里面有个Field是放的Parent的信息,例如类TA,可以通过类型转换和TA.Parent直接访问父.
jinjazz 2004-11-02
  • 打赏
  • 举报
回复
一个类不需要去关心他父类的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
... ... ...
FrameSniper 2004-11-02
  • 打赏
  • 举报
回复
对象中肯定有指向类的内存地址的信息,否则通过对象调用方法无法实现.....

类中也必须有指向父类的信息,否则Inherited无法实现,类继承也无法实现.....
加载更多回复(14)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧