Spazio stringa esaurito in Visual Basic 6
Domanda
Stiamo riscontrando un errore in un'applicazione VB6 che invia dati avanti e indietro su socket TCP.Otteniamo un errore di runtime "out of string space".Qualcuno lo ha visto o ha qualche idea sul perché ciò sia accaduto?Sembra che stiamo raggiungendo la soglia VB6, quindi anche qualsiasi altro pensiero sarebbe utile.
thks, ak
Soluzione
Come altri hanno sottolineato, ogni concatenazione di stringhe in VB assegnerà una nuova stringa, quindi copierà i dati e quindi disallocherà l'originale una volta possibile.In un ciclo ciò può causare problemi.
Per risolvere questo problema puoi creare una semplice classe StringBuilder come questa:
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
Questa classe ridurrà al minimo il numero di allocazioni di stringhe forzando la creazione della stringa con spazi al suo interno e quindi sovrascrivendo gli spazi secondo necessità.Viene riallocato per raddoppiare all'incirca le sue dimensioni quando rileva che non dispone di spazio preinizializzato sufficiente.Il metodo Text restituirà la parte della stringa effettivamente utilizzata.
Altri suggerimenti
Testo trovato su MSDN:
http://msdn.microsoft.com/en-us/library/aa264524(VS.60).aspx
Visual Basic per le applicazioni Riferimento fuori dallo spazio delle stringhe (errore 14)
Specifiche
Visual Basic ti consente di utilizzare stringhe molto grandi.Tuttavia, i requisiti di altri programmi e il modo in cui manipoli le stringhe possono causare questo errore.Questo errore ha le seguenti cause e soluzioni:
- Le espressioni che richiedono che le stringhe temporanee vengano create per la valutazione possono causare questo errore.Ad esempio, il seguente codice provoca un errore di spazio String su alcuni sistemi operativi:
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
in fase di assegnazione.
Rimuovere eventuali applicazioni non necessarie dalla memoria per creare più spazio.
Per ulteriori informazioni, selezionare l'elemento in questione e premere F1.
In aggiunta alla risposta di Jacco, vbAccelerator ha un'ottima classe String Builder che realizza più o meno la stessa cosa ma è un po' più robusta.L'autore illustra anche la soluzione spiegando come funziona.
Supponendo che stai aggiungendo dati in un ciclo, assicurati che non vengano aggiunti a se stessi, il che consumerà memoria molto rapidamente.
Esempio e descrizione del significato dell'errore:http://msdn.microsoft.com/en-us/library/aa264524.aspx
Nella primavera del 2009, Microsoft ha rilasciato un aggiornamento per XP che interferisce con il wrapper Armadillo/Silicon Realms.La riga di codice che generava l'errore 14, Spazio esaurito non era logica.Non ci sono stati problemi con una corda sovradimensionata.Era un compito semplice che ho persino modificato in "foo" e l'errore 14 si verificava ancora.Penso che l'errore sia mappato in modo errato in XP.La risposta per noi è stata rimuovere copyMem-11 dal progetto di protezione Armadillo e riavvolgere l'exe.
Sembra che tu stia aggiungendo spesso una stringa.Potresti provare a usare a Classe StringBuilder
Inoltre, è possibile che tu abbia alcuni oggetti obsoleti che contengono stringhe in giro che non vengono utilizzate e dovrebbero essere liberate.Verificare la presenza di riferimenti circolari, magari registrando l'allocazione/liberazione degli oggetti Class_Initialize/Class_Finalize