我总是读到,一旦我完成它们,建议将对象设置为空.但我通常只在表单内的函数中使用它们.
在保留功能范围时,是否丢失了引用并释放了内存,而不管将对象设置为Nothing?
即是否真的有必要这样做:
Set db = Nothing
Set record_set = Nothing
Run Code Online (Sandbox Code Playgroud) 如果一个对象数组被声明为Variant类型(以便轻松检查它是否使用IsEmpty函数初始化),那么,如果随后定义的数组的元素被引用为With语句的对象表达式(例如With VariantObjArray(i) ...
),那么对象变量数组元素将被错误地释放(尽管With语句的对象变量的隐式副本将在单个后续执行过程中正确运行 - 通过With语句的范围)。此外,数组元素对象变量的错误释放可能是内存泄漏,因为它是在执行 With 表达式时立即发生的,而不是任何标准释放机制(例如退出With语句或从子例程返回)的结果或明确设置为 Nothing。
Sub DemoVariantObjArrayBug()
Dim i As Integer
Dim NextWkSh As Worksheet
Static VariantObjArray As Variant
If IsEmpty(VariantObjArray) Then 'Check to avoid unnecessary re-allocation of static or global array variable
ReDim VariantObjArray(1 To ThisWorkbook.Worksheets.Count)
For Each NextWkSh In ThisWorkbook.Worksheets
i = i + 1: Set VariantObjArray(i) = ThisWorkbook.Worksheets(i)
Next NextWkSh
End If
Stop 'and, to observe the bug, open the Locals …
Run Code Online (Sandbox Code Playgroud)