擦除与数组中的ReDim
背景:
我刚刚遇到了这个问题,并让我了解了数组中的擦除声明。
我一直使用以下来重置它们:
Sub TestWithRedimOnly() Dim ExampleArray() As String ReDim Preserve ExampleArray(1) ExampleArray(1) = "yo" MsgBox ExampleArray(1) ReDim ExampleArray(0) As String MsgBox ExampleArray(1) 'this confirms is reset! End Sub
如果我用擦除来做
Sub TestWithEraseAndRedim() Dim ExampleArray() As String ReDim Preserve ExampleArray(1) ExampleArray(1) = "yo" MsgBox ExampleArray(1) Erase ExampleArray MsgBox ExampleArray(1) 'this confirms is reset! ReDim ExampleArray(0) As String MsgBox ExampleArray(1) 'this confirms is reset! End Sub
最后,重置variables。
问题:使用擦除语句真的值得吗? 它是否可以防止内存泄漏比只是Redim.. As..
更好Redim.. As..
有什么情况下,你可以回想一下不这样做呢?
如果有疑问,请使用语义:
- 使用
ReDim
重新定义一个数组 - 使用
Erase
来释放数组
坚持这一点将使您的代码从更大的一致性中受益,并使您的代码更清楚地向读者/维护者/将来您。
既然你问到Redim与Erase有关内存的后果……唯一的实际区别是dynamic数组。
如果擦除非dynamic数组,则将其中的值设置为0,零长度string或variables的“空”。 例如:Dim Array(10)
如果你擦除dynamic数组,它完全释放内存。 例如:Dim Array()
这两个选项都不应该导致内存泄漏。 两者都应该导致内存释放的方式不会不断扩大所使用的内存,如果你循环访问数组和redim /擦除你的代码的数组部分。 如果你正在运行内存泄漏代码循环,这可能是一个更好的问题。
从擦除的帮助:
Dim NumArray(10) As Integer ' Integer array. Erase NumArray ' Each element set to 0. Dim StrVarArray(10) As String ' Variable-string array. Erase StrVarArray ' Each element set to zero-length string (""). Dim StrFixArray(10) As String * 10 ' Fixed-string array. Erase StrFixArray ' Each element set to 0. Dim VarArray(10) As Variant ' Variant array. Erase VarArray ' Each element set to Empty. Dim DynamicArray() As Integer ' Dynamic array. ReDim DynamicArray(10) ' Allocate storage space. Erase DynamicArray ' Free memory used by array.