【发布时间】:2019-07-25 20:04:14
【问题描述】:
我们在通过 TCP 套接字来回发送数据的 VB6 应用程序中遇到错误。我们得到一个运行时错误“字符串空间不足”。有没有人看到这一点或对为什么会发生这种情况有任何想法?看起来我们正在达到一些 VB6 阈值,因此任何其他想法也会有所帮助。
【问题讨论】:
-
能否将代码粘贴到返回错误的行周围?
-
所涉及的变量的声明也很有用
我们在通过 TCP 套接字来回发送数据的 VB6 应用程序中遇到错误。我们得到一个运行时错误“字符串空间不足”。有没有人看到这一点或对为什么会发生这种情况有任何想法?看起来我们正在达到一些 VB6 阈值,因此任何其他想法也会有所帮助。
【问题讨论】:
正如其他人所指出的,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 应用程序 引用字符串空间不足(错误 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
【讨论】:
在 2009 年春季的某个时候,Microsoft 进行了 XP 更新,该更新会干扰 Armadillo/Silicon Realms 包装器。 引发错误 14,Out of String space 的代码行不合逻辑。过大的字符串没有问题。这是一个简单的任务,我什至将其更改为“foo”,但仍然发生错误 14。我认为错误在 XP 中映射不正确。 我们的答案是从 Armadillo 保护项目中删除 copyMem-11 并重新包装 exe。
【讨论】:
听起来你经常附加一个字符串。您可以尝试使用StringBuilder class
另外,您可能有一些陈旧的对象,其中包含未使用的字符串,应该被释放。可能通过在Class_Initialize/Class_Finalize 中记录对象分配/释放来检查循环引用
【讨论】: