我们在通过TCP套接字来回发送数据的VB6应用程序中发生错误。我们得到一个“超出字符串空间”的运行时错误。有没有人看到这个或有任何想法,为什么会发生?似乎我们正在触及一些VB6的门槛,所以任何其他的想法也会有所帮助。在Visual Basic 6中超出字符串空间
THKS, AK
我们在通过TCP套接字来回发送数据的VB6应用程序中发生错误。我们得到一个“超出字符串空间”的运行时错误。有没有人看到这个或有任何想法,为什么会发生?似乎我们正在触及一些VB6的门槛,所以任何其他的想法也会有所帮助。在Visual Basic 6中超出字符串空间
THKS, AK
正如其他人所指出的,在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。
假设你正在一个循环中追加数据,确保它没有被追加到自身,这将会非常快速地消耗内存。
实例和错误的含义说明: http://msdn.microsoft.com/en-us/library/aa264524.aspx
听起来好像你经常追加一个字符串。你可以尝试使用StringBuilder class
此外,它可能是你有一些陈旧的对象,包含挂在周围没有被使用,应该被释放的字符串。检查循环引用可能是通过记录对象分配/释放Class_Initialize/Class_Finalize
添加到Jacco的响应中,vbAccelerator有一个很棒的String Builder类,它完成了大致相同的事情,但是更加健壮一些。作者还介绍了解决方案的工作原理。
在2009年春天的某个时候,微软做了一次XP更新,干扰了Armadillo/Silicon Realms包装。 抛出错误14,超出字符串空间的代码行不合逻辑。超大尺寸的字符串没有问题。这是一个简单的任务,我甚至改变为“富”,错误14仍然发生。我认为错误在XP中映射不正确。 我们的答案是从Armadillo保护项目中移除copyMem-11并重新包装exe。
你可以将代码粘贴到返回错误的那一行吗? – Robit 2008-09-18 16:05:00
所涉变量的声明也可能有用 – Robit 2008-09-18 16:06:03