我们在通过 TCP 套接字来回发送数据的 VB6 应用程序中遇到错误。我们得到一个运行时错误“字符串空间不足”。有没有人看到这个或有任何想法为什么会发生这种情况?似乎我们正在达到一些 VB6 阈值,因此任何其他想法也会有所帮助。
6 回答
正如其他人指出的那样,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 方法将返回实际使用的字符串部分。
在 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。
除了 Jacco 的响应之外,vbAccelerator有一个很棒的 String Builder 类,它可以完成很多相同的事情,但更健壮一些。作者还介绍了解决方案,解释了它是如何工作的。
假设您在循环中附加数据,请确保它不会被附加到自身,这将非常迅速地消耗内存。
错误含义示例及说明:http: //msdn.microsoft.com/en-us/library/aa264524.aspx
听起来您经常附加一个字符串。您可以尝试使用StringBuilder 类
此外,您可能有一些陈旧的对象,其中包含未使用的字符串,应该被释放。可能通过记录对象分配/释放来检查循环引用Class_Initialize/Class_Finalize
2009 年春天的某个时候,Microsoft 进行了 XP 更新,该更新会干扰 Armadillo/Silicon Realms 包装器。引发错误 14,Out of String space 的代码行不合逻辑。过大的字符串没有问题。这是一个简单的任务,我什至将其更改为“foo”,但仍然出现错误 14。我认为错误在 XP 中映射不正确。我们的答案是从 Armadillo 保护项目中删除 copyMem-11 并重新包装 exe。