我們在通過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