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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top