超出Visual Basic 6中的字符串空间

时间:2008-09-18 16:03:42

标签: string memory vb6

我们在VB6应用程序中收到错误,该应用程序通过TCP套接字来回发送数据。我们得到一个“超出字符串空间”的运行时错误。有没有人看到这个或有任何想法为什么会发生这种情况?看起来我们正在打一些VB6门槛,所以任何其他的想法也会有所帮助。

THKS, AK

6 个答案:

答案 0 :(得分:11)

正如其他人所指出的那样,VB中的每个字符串连接都将分配一个新字符串,然后复制数据,然后一旦取消原始字符串就可以解除分配。在循环中,这可能会导致问题。

要解决此问题,您可以创建一个简单的StringBuilder类,如下所示:

Option Explicit

Private data As String
Private allocLen As Long
Private currentPos As Long

Public Function Text() As String
  Text = Left(data, currentPos)
End Function

Public Function Length() As Long
  Length = currentPos
End Function

Public Sub Add(s As String)

  Dim newLen As Long
  newLen = Len(s)
  If ((currentPos + newLen) > allocLen) Then
    data = data & Space((currentPos + newLen))
    allocLen = Len(data)
  End If

  Mid(data, currentPos + 1, newLen) = s
  currentPos = currentPos + newLen

End Sub

Private Sub Class_Initialize()
  data = Space(10240)
  allocLen = Len(data)
  currentPos = 1
End Sub

此类将通过强制在其中使用空格构建字符串然后根据需要覆盖空格来最小化字符串分配的数量。当它发现它没有预先初始化的足够空间时,它会重新分配大小的两倍。 Text方法将返回实际使用的字符串部分。

答案 1 :(得分:2)

在MSDN上找到的文字:

http://msdn.microsoft.com/en-us/library/aa264524(VS.60).aspx

  

Visual Basic for Applications   参考字符串空间(错误   14)

     

具体细节

     

Visual Basic允许您使用   大字符串。然而   其他计划的要求和   你可以操纵你的弦乐的方式   导致此错误。这个错误有   以下原因和解决方案:

     
      
  • 要求为其创建临时字符串的表达式   评估可能会导致此错误。对于   例如,以下代码导致   一些字符串空间错误   操作系统:
  •   
MyString = "Hello"
For Count = 1 To 100
MyString = MyString & MyString
Next Count
  Assign the string to a variable of another name.
* Your system may have run out of memory, which prevented a string from
     

被分配。

     

从内存中删除任何不必要的应用程序来创建   更多空间。

     

有关其他信息,请选择   有问题的项目,然后按F1。

答案 2 :(得分:2)

添加到Jacco的响应中,vbAccelerator有一个很棒的String Builder类,可以完成同样的事情,但是更强大一点。作者还介绍了解决它如何工作的解决方案。

答案 3 :(得分:0)

假设您在循环中追加数据,请确保它没有附加到自身,这会非常快速地占用内存。

错误含义的示例和描述: http://msdn.microsoft.com/en-us/library/aa264524.aspx

答案 4 :(得分:0)

听起来你经常附加一个字符串。您可以尝试使用StringBuilder class

此外,您可能有一些陈旧的对象包含悬挂的字符串,这些字符串未被使用且应该被释放。通过在Class_Initialize/Class_Finalize

中记录对象分配/释放来检查循环引用

答案 5 :(得分:0)

2009年春天的某个时候,微软做了一次XP更新,干扰了Armadillo / Silicon Realms包装。 抛出错误14的代码行,超出字符串空间是不合逻辑的。超大字符串没有问题。这是一个简单的任务,我甚至改为“foo”,错误14仍然发生。我认为错误在XP中映射不正确。 我们的答案是从Armadillo保护项目中删除copyMem-11并重新包装exe。