静态关键字解决方法适用于"内存不足"错误?

时间:2018-03-19 18:19:05

标签: static vb6

是否存在一些已知的VB6问题或问题,使用静态变量可以避免内存不足错误?

详细说明:

获得了一个独特的最终用户问题报告,该报告描述了错误#7"内存不足"从我支持的VB6应用程序。这是我所知道的唯一问题;我无法在本地重现它。

错误报告显示失败的程序;在那个过程中,我发现了以下内容:

Sub CreateDir()
Dim elm As Variant
Dim strCheckPath As String
Dim strPath As Range

Set strPath = Sheet1.Range("E2:E57")

strCheckPath = ""
For Each elm In Split(strPath, "\")
    strCheckPath = strCheckPath & elm & "\"
    If Len(Dir(strCheckPath, vbDirectory)) = 0 Then MkDir strCheckPath
Next

End Sub

也许有些人在过去几年中遇到了类似的错误,并提出了这种黑客作为解决方法。我们在其他地方看不到这种模式。

据我所知,报告内容不足"内存不足"在执行这些行之后很长时间才会发生错误。

(古代)documentation reference for this error message似乎没有提供与此相对应的任何内容。 Google / SO搜索也没有任何改变。

我的解释是,作者试图通过将'the below is static because it didn't fit on the stack Static obReport As clsReport 'this makes it work like it did when it was on the stack Set obReport = Nothing Set obReport = New clsReport 变量分配给堆obReport来释放堆栈空间。我可以想象有人认为这可以"保存"以某种方式记忆。

但是这个片段可能只是废话......如果Static关键字只能将对象引用从堆栈中取出,而不是我认为在堆中的实际对象无论如何。我无法看到这可以解决任何问题,除非它是一个VB6怪癖/错误,而且无法正常推理。

(或者,我错了 - 启发我!)

1 个答案:

答案 0 :(得分:1)

VB的一些古老版本,甚至回到VBDOS,都有一些像你描述的怪癖,但我不认为它们与类有关。我们曾经把解决方案称为“巫术编程”,它们通常用于触发垃圾收集。指令本身根本不做任何事情,但它们的存在会导致垃圾收集发生在代码中的不同位置。赠品通常是“不要移动或删除以下代码”。

我确实看到一些事情,从更大的角度来看,可能会导致一个解决方案。 “独特的最终用户问题”和“这是我所知道的问题的唯一案例;我无法在本地重现它“和”报告的'内存不足'错误直到代码后面才出现“。从您链接的VBA文档:“您打开了太多的应用程序,文档或源文件。关闭所有打开的不必要的应用程序,文档或源文件。“唯一的”内存不足“或”资源不足“我看到这样的情况发生在最终用户有许多很多程序和/或浏览器的机器上使用极少量的RAM运行时,浏览器窗口会打开。

因此,在显示错误时,使用远程桌面等检查最终用户的运行时环境。它可能是有效的错误消息。

从您链接的VBA文档:“您的模块或过程太大了。将大型模块或程序分解为较小的模块。这不会节省内存,但它可以防止达到64K段边界。“你试过这个吗?这将是下一步。

您可能只是有内存泄漏。使用任务管理器检查是否已创建多个obReport实例且未正确终止。 “该程序的工作是收集数据,然后显示一些报告。”有多少数据和多少报告?试图通过设计或编程错误处理大量数据是否会导致内存不足错误?