我不太明白Tobject类的free方法和析构函数之间的关系,是不是free方法负责清除类的在var处声明的变量,而析构函数负责清除在类方法中动态分配的内存?还有,在C++中,有拷贝构造函数来避免在类方法中申请的资源被二次析构,而在object pascal中是利用什么机制来避免这一问题的?
解决方案 »
- 在delphi中如何销毁DLL中创建的实例
- 数据存储问题~急!
- 请问如何用一个定义一个TStringlist类型或者其他数组函数获取XML中class下的各元素的值????又如何调用呢?急急急啊!!!
- 好好学习delphi,嘿嘿
- 请教关于progressbar的fillcolor属性的问题.
- 散个小分!!!呵呵!
- 怎样比较的取得服务器的系统时间??
- 使用ADOQuery 时,怎么编程可以动态连接不同的*.dbf类的数据库啊!!
- 关于TNMHTTP 协议的 post 方法问题
- 关于BDE打包的问题!非常急!!!
- 如何将小数转成整数,请看例子:
- 新手的问题!!!!!! 非常简单!!!!!!!!!!!!!!!!!!
begin
if Self <> nil then
Destroy;
end;
Free就是判断对象实例是否为nil,来调用Destroy析构函数
就是这样的关系
VCL对象必须用堆生成,用前要Create,用后要Free
a := TObject.Create
a.Free;这跟c++中在堆中创建对象释放对象new,delete类似,
二次析构不是太明白,能否说说
Destroy;
所以Free方法不正避免了二次析构的问题嘛?
所以不同的子类可以OVERRIDE 这个函数从而实现不同子类的析构,这也是OOP的一个典型的方法。
free为TOBJECT的一个静态函数
function tobject.free(self:tobject);
if Self <> nil then
Destroy;//多态的典型用法
end;
首先
var
I:TBUTTON
I 变量只是一个指针, sizeof(I)=4
这一点C++BULDER讲的很清楚
如果
I:=TBUTTON.CREATE //在堆中分配MEM
那么I变量指向了一个空间
这个空间有他的成员还有一个VMT的指针
那么这个空间大小为
I.INSTANCESIZE
也就是现在I的指针初始化了
实际上CREATE在tobject中已经定义了
他就是GETMEM(TT,INSTANCESIZE),然后做初始化什么的好多细节可以看其它的书.
所以最后要对I.Free把I指向的空间FREE掉,否则就泄露了第二个问题不知道你的意思
============
我不太明白Tobject类的free方法和析构函数之间的关系,是不是free方法负责清除类字段,而析构函数负责清除在类方法中动态分配的内存?
============大家想要解答的话希望能回答是或不是,如果不是又是怎样的机制?
还有,上面那个关于free的伪代码我在mastring delphi也见过,我想知道的是
free里除了这些工作是不是还有其他的工作,他难道只是判断self是否为nil ?对于第二个问题我明白了,其实就像 eulb(执子之手,与子偕老) 所说,谢谢。
我OBJECT PASCAL看的太粗了点,什么都往C++上类比
那不是Free的伪代码,就是Free的源代码
就是判断Self是否为nil
如果不为nil就调用Destroy
没别的了
如果不为nil就调用Destroy
一般DESTROY里面会调用FREEINSTANCE的类方法
而FREEINSTANCE的类方法就是释放你CREATE里面获得的MEM
那确实是伪代码,因为真正的free是用汇编写的:)算了,我也不想深究了,我差不多明白了,谢谢大家