【发布时间】:2019-05-30 21:09:08
【问题描述】:
Option Explicit
Dim VBFlexGridCells() As String
Private Sub store_values()
On Error GoTo store_values_EH
Dim IndexLong As Long
Dim i As Integer
Dim entry As String
Dim rw As Integer
Dim aa As String
Dim bb As String
Dim cc As String
Dim dd As String
Dim ee As String
Dim jj As Integer
Dim ff As String
Dim ll As String
Dim mm As String
Dim nn As String
Dim kk As String
rw = 1
For rw = 0 To 15000
aa = String(10000, "w")
bb = String(125, "w")
cc = String(125, "w")
dd = String(125, "w")
ee = String(125, "w")
ff = String(125, "w")
kk = String(125, "w")
ll = String(125, "w")
mm = String(125, "w")
nn = String(125, "w")
entry = aa & Chr(9) & bb & Chr(9) & cc & Chr(9) & dd & Chr(9) & ee & Chr(9) & ff & Chr(9) & kk & Chr(9) & ll & Chr(9) & mm & Chr(9) & nn
IndexLong = IndexLong + 1
ReDim Preserve VBFlexGridCells(10, IndexLong)
Dim abc() As String
abc = Split(entry, vbTab)
For jj = LBound(abc) To UBound(abc)
VBFlexGridCells(jj, IndexLong) = abc(jj)
Next
Next
Exit Sub
store_values_EH:
MsgBox Err.Description & Space(10) & "store_values"
End Sub
在执行上述代码之前,我们的vb6程序使用的内存:17,720 KB
上面的代码执行后,我们的vb6程序使用的内存:386,836 KB
我们在代码执行后的内存使用近似值:320 MB 实际内存使用量和近似内存使用量在同一范围内 ~300MB
但是,当字符串 cc 增加到 126 个字符时,内存使用量会出现巨大的峰值。
cc = String(126, "w")
我们的vb6程序在代码执行后使用的内存:700.04 MB
我们在代码执行后的内存使用近似值:320 MB
内存使用量从 320 Mb 增加到 700 MB。类似地,当其他字符串增加到 126 chars 时,内存在 GB 范围内激增并导致“内存不足”错误。vb6 字符串附加似乎也存在一些问题(http://www.aivosto.com/articles/stringopt2.html“构建巨大的字符串”)
是否有任何选项可以检测和清除(取消分配)vb6 中未使用的内存?
【问题讨论】:
-
当您删除
redim preserve并一次分配整个VBFlexGridCells(10, 15000)时会发生什么? -
@Gserg 没有变化,将达到 700 MB。
-
如果整个字节长度 (
4 + chars_count*2 + 2) 不大于 256,看起来 VB6 使用了一种优化的字符串处理方式,但这很奇怪,因为有问题的字符串不会改变并且不要直接存储,重要的是entry,但它的长度似乎无关紧要(例如,如果您将cc增加到126 但将dd减少到124,即使@ 987654334@ 长度保持不变)。似乎也没有内存泄漏,因为当你Erase VBFlexGridCells时,所有内存都回来了。 -
@GSerg for
aa到 16000 ,cc到 125 ,内存使用量为 500 MB,然后将cc增加到 126 ,内存使用量为 1 GB。对于aa到 16500,cc到 125,内存使用量为 530 MB,但随后将cc增加到 126,内存使用量仅为 530 MB。
标签: string memory-management vb6