探究:Delphi中的对象指针是否可用 ——这个ClassType方法并不是真正的对象方法,而颇有些类方法的味道。ClassType返回的本身就是TClass。也就是类方法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也知道Free、Assigned()函数的问题,所以我总是在Object。Free后使用Object= NIL;但我想,既然Borland在释放对象实例的内存空间后,依然保留它的类信息,必然有其他的需要。 to 童童:Object.Free;Object := nil;这是一种非常好的习惯。 另外,在不同的操作系统下,比如Windows 98 和Windows NT,如果不执行Object=NIL;语句,那么可能造成对象的表现的差异。我曾经对一个AboutBox的Form的非客户区进行绘制,如果使用Ojbect=NIL;那么在以上两种操作系统下,该Form的表现是完全一样的,若不使用,在98下会出现窗口的非客户区时而绘制,时而不绘制的结果。 to Nicrosoft:多谢夸奖。 to Nicrosoft: 我想你误解了我的意思了,我说的类方法指得是方法本身是类方法Class Method,而不是指方法作为一个函数返回值的类型。你指的“类方法”或许称为类类型,比较可取。 同意Free以后赋值为nil,这是个好习惯。 我以前在Borland的新闻组看见有一个人写过这种测试函数(未被验证过)。你可以去google搜索一下。现在有FreeAndNil函数,指针在没用的情况下清零本来就是一个非常好的编程习惯。(好像许多书中都提到过) 这几天我在考虑另外一个问题,即关于对象的类信息和他的实例信息的内存结构及存储问题。现在可以确定Free方法只是释放了对象实例的内存空间,而没有释放实例指针所指向的类信息的内存空间。于是,我想到,是否VCL在创建多个实例时采用了共享类信息的方法,再通过例如引用计数的方法将指针指向不同的实例,即类似于COM的单对象多接口的结构。如果是这样,那么使用FreeAndNil方法后再使用Create方法是否会开辟新的类信息的存储空间而造成内存空间的浪费呢? to TommyTong: 对于相同的RTTI,我认为,Delphi应当是所有的对象实例共用一个信息的。 否则,岂不浪费内存? 并且我觉得即使所有相同类的实例全部释放后,该类型信息依然存在,因为它是静态的,程序运行后,RTTI就放在数据段里面,等待调用。 我不同意“类信息为静态”的说法,如果相通类的所有实例全部释放后类信息依然存在,那么如果该对象到程序结束都不再有实例使用,那就应该释放调,否则绝对浪费内存空间。我觉得类信息应该是动态的,就如同COM一样。关键是对IDL不熟悉呀,我想VCL应该是使用IDL实现的,可惜手头找不到有关IDL的资料。 谢谢 TommyTong(童童) 的回复。对于这部分的内容,我真的也不太清楚,去找些书看看再来讨论。 关注一下这篇《Object Pascal:从对象指针谈起》http://www.csdn.net/develop/read_article.asp?id=10124 dll怎么调用? 新来的~~~推荐几个好点的 Delphi 资源站 关于日期时间的小问题 关于integer类型动态数组的setlength问题? 如果我请你到我的公司,你要求的工资是多少??陕西某市 怎么用SQL语句实现以下功能? 菜鸟问题:怎么发windows系统消息? 关于字符‘#’的问题? 灌水问题,Delphi这个东西怎么念? 请进来看看我的程序:将一个表中的内容移到另一个表中(字段不完全移动),怎么出现行数不对呢 请问windows nt的屏幕锁定及解锁API是什么,怎么使用? Ado事务,我受不了了!
Object= NIL;
但我想,既然Borland在释放对象实例的内存空间后,依然保留它的类信息,必然有其他的需要。
Object := nil;这是一种非常好的习惯。
Object=NIL;
语句,那么可能造成对象的表现的差异。
我曾经对一个AboutBox的Form的非客户区进行绘制,如果使用
Ojbect=NIL;
那么在以上两种操作系统下,该Form的表现是完全一样的,若不使用,在98下会出现窗口的非客户区时而绘制,时而不绘制的结果。
多谢夸奖。
我想你误解了我的意思了,我说的类方法指得是方法本身是类方法Class Method,而不是指方法作为一个函数返回值的类型。你指的“类方法”或许称为类类型,比较可取。
同意Free以后赋值为nil,这是个好习惯。
现在有FreeAndNil函数,指针在没用的情况下清零本来就是一个非常好的编程习惯。(好像许多书中都提到过)
现在可以确定Free方法只是释放了对象实例的内存空间,而没有释放实例指针所指向的类信息的内存空间。于是,我想到,是否VCL在创建多个实例时采用了共享类信息的方法,再通过例如引用计数的方法将指针指向不同的实例,即类似于COM的单对象多接口的结构。
如果是这样,那么使用FreeAndNil方法后再使用Create方法是否会开辟新的类信息的存储空间而造成内存空间的浪费呢?
对于相同的RTTI,我认为,Delphi应当是所有的对象实例共用一个信息的。
否则,岂不浪费内存?
并且我觉得即使所有相同类的实例全部释放后,该类型信息依然存在,因为它是静态的,程序运行后,RTTI就放在数据段里面,等待调用。
关键是对IDL不熟悉呀,我想VCL应该是使用IDL实现的,可惜手头找不到有关IDL的资料。
对于这部分的内容,我真的也不太清楚,去找些书看看再来讨论。
《Object Pascal:从对象指针谈起》
http://www.csdn.net/develop/read_article.asp?id=10124