@c_cyd2008 关于创建,这个可能何时都有可能创建,例如form_load,例如button_click,而销毁对象,如果按你第一段说的,form_load里new,就要在form_unload里释放了,这样就违背了即时释放的原则。主要考虑内存占用。按第二段说的,那么说,我在对象所触发的事件里释放这个对象,完全没有问题了是吗?即:Private Sub k_test() MsgBox "d" '假如这个时候,我已经不再需要k这个对象了,能否在下面释放?如果不能,那我想在触发test事件后就释放它,因为我已经不再需要它了,应该怎么释放? Set k = Nothing End Sub
之所以在窗体load时创建,unload时释放,是因为考虑到在窗体整个生存期内你都可能会用到它,如果你只在某一过程内才用到它,那你就应该在这一过程内创建和释放,如你的代码: Private Sub Command1_Click() Set k = New Class1 k.a Set k=Nothing '应在这里释放,不应放在k_test中 End Sub放在k_test中不是不行,不过只会给你带来很多麻烦,特别是引用k的过程比较多时
比如你的类可能如下,有三个方法,分别完成某一件事 Public Event test() Public Sub a() RaiseEvent test End SubPublic Sub b() End Sub Public Sub c() End Sub一种可能的调用: Private Sub Command1_Click() Set k = New Class1 k.a '调用a k.b '调用b k.c '调用c End Sub Private Sub k_test() MsgBox "d" '假如这个时候,我已经不再需要k这个对象了,能否在下面释放?如果不能,那我想在触发test事件后就释放它,因为我已经不再需要它了,应该怎么释放? Set k = Nothing End Sub如果单看上面的调用代码,几乎很难看出有什么问题
类里面其实是这样的:Public Event test(string)Public Sub a() 要求 winsock 干活 End Subsub winsock_close()'winsock工作完成 处理数据,然后触发test事件 raiseevent test(数据) end sub窗体接收事件: Private Sub k_test(string) MsgBox string'看看返回了什么东西 Set k = Nothing '释放对象 End Sub 我的意思是,上面这种释放对象的方法。 这才说明白了,呵呵。
当然,不在同一作用域内创建和释放也可以,但你必须清楚地知道对象什么时候可用,什么时候不可用,特别是当模块很多时!所谓“不安全”多半就是人很难记住在什么地方new了,在什么=nothing
虽说系统有回收机制,但是如果class1会做一些比较占用内存的事情。如果不在它做完后及时nothing,占用内存就会越来越大而且很大。所以就需要在它工作完成以后,及时释放它。从上面的例子来看,触发事件test之后,这个对象就完成了它的工作。那这个时候,由于我可能会new出多个class1对象,这些对象何时完成工作还不一定。为了减少内存占用,为了让程序长时间开着也不至于太占系统资源,所以现在需要释放 完成工作的 这个对象。那么,代码写在对象所触发的事件里为什么那高手说不合理?如果这样,类似上面的代码,销毁的代码写在哪里呢?
关于创建,这个可能何时都有可能创建,例如form_load,例如button_click,而销毁对象,如果按你第一段说的,form_load里new,就要在form_unload里释放了,这样就违背了即时释放的原则。主要考虑内存占用。按第二段说的,那么说,我在对象所触发的事件里释放这个对象,完全没有问题了是吗?即:Private Sub k_test()
MsgBox "d"
'假如这个时候,我已经不再需要k这个对象了,能否在下面释放?如果不能,那我想在触发test事件后就释放它,因为我已经不再需要它了,应该怎么释放?
Set k = Nothing
End Sub
Private Sub Command1_Click()
Set k = New Class1
k.a
Set k=Nothing '应在这里释放,不应放在k_test中
End Sub放在k_test中不是不行,不过只会给你带来很多麻烦,特别是引用k的过程比较多时
我明白你的意思。这个情况有点不同。k.a这个方法并不是立即返回数据。k.a会做一些异步的处理,比如会调用winsock(怎么调用咱先不管它)获取数据。我们都知道winsock是异步的,也就是说,k.a之后,事件不是马上触发,这个时候,command1_click过程结束,也许过上五秒钟,winsock完成了工作,对象k处理完善后之事,触发test事件,test事件触发后主窗体接收事件,处理数据。然后完成整个工作流程。
所以只好把释放对象的活放在了k_test事件中。
Public Event test()
Public Sub a()
RaiseEvent test
End SubPublic Sub b()
End Sub
Public Sub c()
End Sub一种可能的调用:
Private Sub Command1_Click()
Set k = New Class1
k.a '调用a
k.b '调用b
k.c '调用c
End Sub
Private Sub k_test()
MsgBox "d"
'假如这个时候,我已经不再需要k这个对象了,能否在下面释放?如果不能,那我想在触发test事件后就释放它,因为我已经不再需要它了,应该怎么释放?
Set k = Nothing
End Sub如果单看上面的调用代码,几乎很难看出有什么问题
要求 winsock 干活
End Subsub winsock_close()'winsock工作完成
处理数据,然后触发test事件
raiseevent test(数据)
end sub窗体接收事件:
Private Sub k_test(string)
MsgBox string'看看返回了什么东西
Set k = Nothing '释放对象
End Sub
我的意思是,上面这种释放对象的方法。
这才说明白了,呵呵。
非常感谢2位的解答,尤其是c_cyd2008!