擦除与数组中的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.