问题一:
A := TA.Create;在内存中创建的对象的头4个字节到底指向哪?
在《参透Delphi》一书中说是指向:VMT。
在《Delphi对象模型》中说:
在Delphi中,类表现为内存中一张只读的表,表中存放着指向该类的虚方法的指针以及其他许多信息。
创建的对象的头4个字节存放的是一个类引用(Class reference)就是指向该表的一个指针,而该表的头4个字节又是一个指向VMT的指针。//哪 一个是正确的,或者是我自己理解错了吗?
A := TA.Create;在内存中创建的对象的头4个字节到底指向哪?
在《参透Delphi》一书中说是指向:VMT。
在《Delphi对象模型》中说:
在Delphi中,类表现为内存中一张只读的表,表中存放着指向该类的虚方法的指针以及其他许多信息。
创建的对象的头4个字节存放的是一个类引用(Class reference)就是指向该表的一个指针,而该表的头4个字节又是一个指向VMT的指针。//哪 一个是正确的,或者是我自己理解错了吗?
解决方案 »
- 保存图片的属性到数据库中 包含图片的路径,大小,修改日期,图片属性等.
- 前两天应聘的试题
- 如何将格式的文本文件导入ACCESS数据库的表中(使用adoquery)
- SOS! SendMessage(HWndCalculator, WM_CLOSE, 0, 0);不能關閉部份程序!
- Delphi+ADO+SQLServer2000 程序容错处理?
- fastReport3不知如何调整交叉报表的格式及显示位置?注意,是交叉报表!
- 有关delphi版本问题(女朋友给我的任务,完成不了,会损我形象的,大家帮忙!)
- 小问题:如何让TEdit控件只接收数字输入。
- 怎样在局域网中实现广播?TClientSocket可以吗?最好有代码,谢谢
- 客户的问题我们有责任去解决吗
- 操作INI文件,报错!
- stack overflow
内存中创建的对象的头4个字节到底指向VMT
这个应该是父类的VMT~~
这个应该是父类的VMT~~这是我的理解:)应该是指向自己的VMT
---------好像这句不恰当〉〉创建的对象
---------A指针〉〉头4个字节存放的是一个类引用(Class reference)就是指向该表的一个指针
---------指向TA的头四字节而该表的头4个字节又是一个指向VMT的指针。
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() );运行时不会出错,但是程序经常会莫名其妙的出错
结论,知道所有的类都是传引用的就行了,不要多管,知道也没有什么好处
<对象模型>说的不正确
对象创建以后,是分两个部分存放的
一个部分是栈上的对象指针
另外一个部分是堆上的对象实体栈上的对象指针指到堆上的对象实体的内存首地址
对于堆上的对象实体,里面只是存放可读写信息,因此一般是属性内容,至于方法则是放在类的VMT的(类的VMT也存放在堆上,位置应该是在对象实体之前,这个可以写个简单的代码测试一下).堆上对象实体的头四个字节指向类的VMT的堆内存首地址,所以可以认为是一个类引用类型的变量(Delphi的类引用类型就是如此在内存中实现的).对于类的VMT是一个指针表,其中存放的是类信息和类实现或申明的方法信息,都是只读信息.明白?
各种支持OO的语言的对象模型都大同小异,为了支持OO而设计相对应的内存模型.至于内存管理,无论是结构类型还是简单类型各种语言在实现上也没有多大的区别.如果涉及内存回收问题,新型的.net和Java当然做的比传统的OOL要好很多,自动化程度更高,但无论是对于基于引用计数的结构类型还是简单类型内存的管理,个人感觉Delphi比没有什么特别逊色的地方.
...
-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
... ... ...
而一个类在内存中的实体就是那个只读表,表的头4个字节应该是指向类本身的VMT的。FS说的:
对象中肯定有指向类的内存地址的信息,否则通过对象调用方法无法实现.....
...应该是通过对象的其他部分指向的,应该不是头4个字节。类中也必须有指向父类的信息,否则Inherited无法实现,类继承也无法实现.....
...在类表中有指向类类的指针
我所举的例子很明显是由DELPHI所主持下的内存管理
如果是自己写的内存方面的程序,我相信自己没有什么问题至于为什么写得有火气,是因为我因为这个问题查程序查了一个星期才查出来
仅仅是因为内存的越界的访问,而使程序扔出内存异常(程序运行时不出错,整个程序关闭时才会出错),不信你自己试试ps: 你的水平还行,问几个问题
1 DELPHI的IDE中是不是带有内存检测?至少是最常规的内存泄漏检测?(调试环境下)
用BoundsCheck检太麻烦了
2 TTcpClient 在连接出错后,会有内存泄漏(Delphi 6.0),能不能把这些内存找出来释放掉
(主要是做断线重连的程序)
-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直接访问父.--
了解了
指向自己的VMT,就是SELF
而一个类在内存中的实体就是那个只读表,表的头4个字节应该是指向类本身的VMT的。”——这个话是错误的,类中没有指向自己的的信息域!要这样内容的域没有任何实际意义。内存很宝贵!“FS说的:
对象中肯定有指向类的内存地址的信息,否则通过对象调用方法无法实现.....
...应该是通过对象的其他部分指向的,应该不是头4个字节。类中也必须有指向父类的信息,否则Inherited无法实现,类继承也无法实现.....
...在类表中有指向类类的指针”你又错了,对象的头四个字节就是指向类的VMT的,类似CPP对象模型中的VPTR。
我不明白什么叫“类类的指针”,DELPHI之所以这样设计类的内存布局,原因很简单,充分实现代码复用。而代码复用是OO的继承特性所强调的,所以这样设计是为了直接支持OO,是使DELPHI成为OOL的必要条件。
很难的看到FS这厮“务点正事”。
不打扰他的雅兴了,FS继续:)