Мы получаем ошибку в приложении VB6, которое отправляет данные назад и вперед по сокетам TCP. Мы вытаскиваем ошибку периода выполнения "из строкового пространства". Кто-либо видел это или имеет какие-либо мысли о том, почему это произошло бы? Кажется, что мы поражаем некоторый VB6 threshhold, таким образом, любые другие мысли были бы полезны также.
Как другие указали, каждая конкатенация строк в 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
Этот класс минимизирует количество строковых выделений, вынуждая строку быть созданным с пробелами в нем и затем перезаписывая пробелы по мере необходимости. Это перераспределяет для грубого удвоения его размера, когда это находит, что не имеет достаточного количества пространства предварительно инициализированным. Текстовый метод возвратит часть строки, которая на самом деле используется.
Добавляя к ответу Jacco, vbAccelerator имеет великого Строкового Разработчика класс, который выполняет почти такую же вещь, но немного более устойчив. Автор также идет через решение, объясняющее, как оно работает.
Текст нашел на MSDN:
http://msdn.microsoft.com/en-us/library/aa264524 (По сравнению с 60) .aspx
Ссылка Visual Basic for Applications Из строкового пространства (Ошибка 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_Initialize/Class_Finalize
Весной 2009 года Microsoft выпустила обновление для XP, которое мешает работе оболочки Armadillo / Silicon Realms. Строка кода, которая выдавала ошибку 14, Out of String space, была нелогичной. Не было проблем со струной слишком большого размера. Это было простое присвоение, которое я даже изменил на «foo», но ошибка 14 все еще возникала. Думаю, в XP ошибка отображается неправильно. Для нас ответом было удалить copyMem-11 из проекта защиты Armadillo и заново обернуть exe.