L labafa Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-08 #1 我自己写了一个类,有构造函数和析构函数,原本我在form.close的时候调用析构函数, 但由于类的对象被释放后,会引起错误,所以我向问,如果不调用析构函数可以吗?
Y yifeng Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-08 #3 你的类的destructor有问题!或者,你的类是动态创建的吗? 如果不调用,应用程序应该会回收内存空间。但是,destroy每一个对象才能彻底保证没有 memory leak.
飞 飞龙在天 Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-08 #6 不太理解你的意思,几点建议供你参考: 1.如果你说的析构函数是指destructor Destroy的话,那么不要直接调用它,应该调用Free过程。 2.任何对象在使用完之后都应该释放它,有些系统对象系统会自动释放,而你自定义的则一定由你 在程序中释放,即调用Free。 3.你说“类的对象被释放后,会引起错误”,对象被释放后再使用当然会引起错误,这很正常。释放了之 后就不应再使用了。
不太理解你的意思,几点建议供你参考: 1.如果你说的析构函数是指destructor Destroy的话,那么不要直接调用它,应该调用Free过程。 2.任何对象在使用完之后都应该释放它,有些系统对象系统会自动释放,而你自定义的则一定由你 在程序中释放,即调用Free。 3.你说“类的对象被释放后,会引起错误”,对象被释放后再使用当然会引起错误,这很正常。释放了之 后就不应再使用了。
Y yifeng Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-08 #7 hi, menxin. “重出江湖“ 最近太烦,编程编的一头包。 难啊 你怎么样?
M menxin Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-08 #8 呵呵,我都快改行了。很久不编了,快废了。没事上来看看,解决一些菜问题。
L labafa Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-12 #9 我的类是这样定义的 type Tqueue=class private EventList:TList; ...... public constructor Create(); destructor destroy;override; ...... end; constructor TQueue.Create(); begin EventList:=Tlist.Create initializeCriticalSection(m_sect); end; destructor TQueue.destroy; begin EventList.Destroy inherited Destroy; end; 如果我调用析构函数destroy后,程序中确实还用到它,所以会有错, 如果不调用destroy就没错了。所以我不知是否可以不调用。 以上各位众说纷纭,好像没有两个人观点是一致的, 不知是否这个问题大家都没搞清呢?
我的类是这样定义的 type Tqueue=class private EventList:TList; ...... public constructor Create(); destructor destroy;override; ...... end; constructor TQueue.Create(); begin EventList:=Tlist.Create initializeCriticalSection(m_sect); end; destructor TQueue.destroy; begin EventList.Destroy inherited Destroy; end; 如果我调用析构函数destroy后,程序中确实还用到它,所以会有错, 如果不调用destroy就没错了。所以我不知是否可以不调用。 以上各位众说纷纭,好像没有两个人观点是一致的, 不知是否这个问题大家都没搞清呢?
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-12 #10 1.你要的类可以直接从DELPHI的标准类中重载,有个叫Cntrnr.pas?你找找。该单元很小,包括管理 类阶列、类堆栈等结构的类。 2.使用TList没有使用Destroy来释放的。一是TList中的项不会自动释放,二是正如前面二位所说, 使用Free而不是Destroy。 3.一般构造函数和析构函数处理的内容刚好相反。你在构造时建立了临界区,析构时为什么没有释 放? 4.你也应该通过调用free而不是Destroy来释放这个类。
1.你要的类可以直接从DELPHI的标准类中重载,有个叫Cntrnr.pas?你找找。该单元很小,包括管理 类阶列、类堆栈等结构的类。 2.使用TList没有使用Destroy来释放的。一是TList中的项不会自动释放,二是正如前面二位所说, 使用Free而不是Destroy。 3.一般构造函数和析构函数处理的内容刚好相反。你在构造时建立了临界区,析构时为什么没有释 放? 4.你也应该通过调用free而不是Destroy来释放这个类。
L labafa Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-12 #11 to barton, 谢谢你给我指出了我很多不正确的写法,那么按你的意思还是要写Free来释放我的类的, 可是我释放后因为程序还在继续调用,所以会有错。 另外, 1。你说的那个文件我找不到,是这个文件名吗? 2。其实我不知道destroy与free的区别,你说TList中的项不会自动释放,又说要用free释放,是什么意思呢? 3。我用InitializeCriticalSection初始化临界区,help上并没有说他是需要释放的, 我原本以为是用create创建的才需要释放。
to barton, 谢谢你给我指出了我很多不正确的写法,那么按你的意思还是要写Free来释放我的类的, 可是我释放后因为程序还在继续调用,所以会有错。 另外, 1。你说的那个文件我找不到,是这个文件名吗? 2。其实我不知道destroy与free的区别,你说TList中的项不会自动释放,又说要用free释放,是什么意思呢? 3。我用InitializeCriticalSection初始化临界区,help上并没有说他是需要释放的, 我原本以为是用create创建的才需要释放。
B bbkxjy Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-12 #12 不用的时候才 Free 释放掉,还要用就不能 Free. 1.是 contnrs.pas。 2.区别是 Free 先确定对象变量不为 nil 才调用 Destroy。TList Destroy 时释放自己, 但不会释放 Items 属性中各指针所指向的内存空间。 3,在 Destroy 中调用 DeleteCriticalSecion 释放临界区所使用的资源。
不用的时候才 Free 释放掉,还要用就不能 Free. 1.是 contnrs.pas。 2.区别是 Free 先确定对象变量不为 nil 才调用 Destroy。TList Destroy 时释放自己, 但不会释放 Items 属性中各指针所指向的内存空间。 3,在 Destroy 中调用 DeleteCriticalSecion 释放临界区所使用的资源。
T tbase Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-14 #13 你的destructor 不要override 因为你的class 是继承TObject的
M mikedeakins Unregistered / Unconfirmed GUEST, unregistred user! 2001-06-14 #14 你的 constructor 是在哪里使用的?如果是在 form oncreate 里面,应当在 on destroy 中调用析构函数。 如果你的类继承自 TObject,可以不调用析构函数,程序结束的时候会自动调用的。
你的 constructor 是在哪里使用的?如果是在 form oncreate 里面,应当在 on destroy 中调用析构函数。 如果你的类继承自 TObject,可以不调用析构函数,程序结束的时候会自动调用的。
D danliyou Unregistered / Unconfirmed GUEST, unregistred user! 2002-02-08 #15 没有说明肯定继承自TObject,所以不用调用析构函数。
J Johnqiu Unregistered / Unconfirmed GUEST, unregistred user! 2002-02-15 #17 我补充一下: 只有全局的实例系统才会自动释放 动态创建的实例只有等程序全部退出时才会释放 所以最好是手工释放,养成比较好的习惯