3 回答
TA贡献1833条经验 获得超4个赞
VB6 / VBA使用确定性方法存储对象。每个对象存储对其自身的引用数量。当数字达到零时,对象将被销毁。
当对象变量Nothing
超出范围时,保证将其清除(设置为),这将减少其各自对象中的引用计数器。无需手动操作。
当您需要显式清理时,只有两种情况:
当您要在对象的变量超出范围之前对其进行销毁时(例如,您的过程将花费很长时间执行,并且该对象拥有资源,因此您希望尽快销毁该对象以释放对象)资源)。
在两个或多个对象之间具有循环引用时。
如果
objectA
存储objectB
并objectB
引用了objectA
这两个对象,则除非通过显式设置objectA.ReferenceToB = Nothing
或制动链,否则这两个对象将永远不会被破坏objectB.ReferenceToA = Nothing
。
您显示的代码段是错误的。无需手动清理。进行手动清理甚至有害,因为这会使您对更正确的代码有错误的认识。
如果在类级别具有变量,则在销毁类实例时将清除/销毁该变量。您可以根据需要提前销毁它(请参阅第项1.
)。
如果在模块级别具有变量,则在程序退出时(或在VBA情况下,当VBA项目重置时)将清除/销毁该变量。您可以根据需要提前销毁它(请参阅第项1.
)。
变量的访问级别(公共或私有)不会影响其生存时间。
TA贡献1803条经验 获得超3个赞
VBA使用通过引用计数实现的垃圾收集器。
一个给定对象可以有多个引用(例如,Dim aw = ActiveWorkbook创建对Active Workbook的新引用),因此,垃圾收集器仅在明确没有其他引用时才清除该对象。设置为Nothing是减少引用计数的一种明确方法。退出范围时,计数将隐式递减。
严格来说,在现代Excel版本(2010+)中,没有必要将“无”设置为“空”,但是较早版本的Excel存在一些问题(为此必须明确设置解决方法)
TA贡献1812条经验 获得超5个赞
我至少有一种情况不会自动清除数据,最终将导致“内存不足”错误。在用户窗体中,我有:
Public mainPicture As StdPicture
...
mainPicture = LoadPicture(PAGE_FILE)
销毁UserForm后(Unload Me),mainPicture未取消分配为中加载的数据分配的内存。我必须添加一个明确的
mainPicture = Nothing
在终止事件中。
- 3 回答
- 0 关注
- 1657 浏览
添加回答
举报