Erase vs ReDim In Arrays

时间:2016-06-30 16:12:55

标签: arrays excel vba excel-vba

背景

我刚遇到this question并让我了解了数组中的erase陈述。

我一直使用以下方法重置它们:

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

最后,两者都重置变量。

问题: 使用擦除声明真的值得吗?它是否能够比Redim.. As..更好地防止内存泄漏?是否有任何情况可以让你回想起不这样做?

2 个答案:

答案 0 :(得分:5)

因为你特别询问了Redim vs Erase在内存方面的后果......唯一的实际区别在于动态数组。

如果擦除非动态数组,则将其中的值设置为0,零长度字符串或"空"对于变种。例如:Dim Array(10)

如果擦除动态数组,它会完全释放内存。例如:Dim Array()

这两个选项都不会导致内存泄漏。如果循环遍历数组并重新编码/擦除代码的数组部分,两者都应该导致内存释放,而不会不断扩展所使用的内存。如果您遇到通过代码循环的内存泄漏,那么这可能是一个更好的问题。

从擦除帮助:

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.

答案 1 :(得分:2)

如有疑问,请使用语义:

  • 使用ReDim 重新维度数组
  • 使用Erase 取消分配数组

坚持这一点将使您的代码从更高的一致性中受益,并使您的代码对读者/维护者/未来的意图更清晰。

相关问题