Aus Zeichenfolge-Speicherplatz in Visual Basic 6
Frage
Wir bekommen einen Fehler in einer VB6-Anwendung, die Daten hin und her über TCP-Sockets sendet. Wir bekommen einen Laufzeitfehler „aus String-space“. Hat jemand diese oder irgendwelche Gedanken gesehen, warum dies geschehen würde? Es scheint, wie wir einige VB6 Schwelle so dass alle anderen Gedanken und wäre hilfreich schlagen.
thks, ak
Lösung
Wie andere haben darauf hingewiesen, wird jeder String-Verkettung in VB eine neue Zeichenfolge zuweisen und dann die Daten über kopieren und dann de-allocate das Original einmal, es kann. In einer Schleife kann dies zu Problemen führen.
Um dies zu umgehen Sie eine einfache Klasse String wie diese erstellen:
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
Diese Klasse wird die Anzahl der Stringzuweisungen minimieren, indem die Schnur zwingt mit Leerzeichen darin gebaut werden und dann die Räume überschrieben wird je nach Bedarf. Es neu zuordnet auf etwa das Doppelte seiner Größe, wenn es feststellt, dass es nicht genug Platz vorinitialisiert hat. Der Text Verfahren wird den Teil der Zeichenfolge zurück, die tatsächlich verwendet wird.
Andere Tipps
Text auf MSDN gefunden:
http://msdn.microsoft.com/ en-us / library / aa264524 (VS.60) aspx
Visual Basic für Applikationen Referenz Aus Zeichenfolge-Speicherplatz (Error 14)
Besonderheiten
Visual Basic ermöglicht es Ihnen, sehr zu verwenden große Strings. Allerdings ist die Anforderungen anderer Programme und die So können Sie manipulieren die Saiten können verursachen diesen Fehler. Dieser Fehler hat die Folgende Ursachen und Lösungen:
- Ausdrücke zu verlangen, dass temporäre Strings erstellt werden Auswertung kann diesen Fehler verursachen. Zum beispielsweise der folgende Code bewirkt, dass ein Aus Zeichenfolge-Speicherplatz Fehler auf einigen Betriebssysteme:
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
zugeordnet ist.
Entfernen Sie alle nicht benötigten Anwendungen aus dem Speicher zu erstellen mehr Platz.
Für weitere Informationen wählen Sie die Artikel in Frage, und drücken Sie F1.
Zusätzlich zu Jacco Antwort, vbAccelerator hat eine große String Builder-Klasse, die genau dasselbe erreicht, aber ein wenig robuster ist. Der Autor geht auch durch die Lösung zu erklären, wie es funktioniert.
Unter der Annahme, dass Sie Daten in einer Schleife anhängen, stellen Sie sicher, dass es nicht an sich selbst angehängt wird, die extrem schnell Speicher essen.
Beispiel und Beschreibung der Fehler Bedeutung: http://msdn.microsoft.com/en-us/library/aa264524. aspx
Irgendwann im Frühjahr 2009, Microsoft hat ein XP-Update, das mit Armadillo / Silicon Realms Wrapper stört. Die Codezeile, die das Werfen wurde Fehler 14, Out of String Raum war nicht logisch. Es gab kein Problem mit einem übergroßen String. Es war eine einfache Zuordnung, die ich selbst zu sein „foo“ und Fehler geändert 14 noch aufgetreten. Ich denke, der Fehler falsch in XP abgebildet wird. Die Antwort war für uns CopyMem-11 aus dem Armadillo Schutzprojekt und rewrap die die exe.
entfernenEs klingt wie Sie eine Zeichenfolge oft anhängen. Sie könnten versuchen, eine Klasse String
Auch könnte es sein, einige veraltete Objekte haben, die Strings rumhängen enthalten, die nicht verwendet werden und befreit werden sollten. Überprüfen Sie für zirkuläre Referenzen vielleicht, indem Sie Objektzuordnung / frees in Class_Initialize/Class_Finalize