문제

TCP 소켓을 통해 데이터를 주고받는 VB6 응용 프로그램에서 오류가 발생했습니다."문자열 공간 부족"이라는 런타임 오류가 발생합니다.이것을 본 사람이 있거나 왜 이런 일이 발생하는지 생각한 사람이 있습니까?VB6 임계값에 도달한 것 같으므로 다른 생각도 도움이 될 것입니다.

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을 누릅니다.

Jacco의 답변에 추가하여, vb가속기 거의 동일한 작업을 수행하지만 조금 더 강력한 훌륭한 String Builder 클래스가 있습니다.저자는 또한 솔루션이 어떻게 작동하는지 설명합니다.

루프에 데이터를 추가한다고 가정하면 데이터가 자체적으로 추가되지 않도록 해야 합니다. 이로 인해 메모리가 매우 빨리 소모됩니다.

오류 의미의 예 및 설명:http://msdn.microsoft.com/en-us/library/aa264524.aspx

2009년 봄 어느 시점에 Microsoft는 Armadillo/Silicon Realms 래퍼를 방해하는 XP 업데이트를 수행했습니다.오류 14, Out of String 공간을 발생시킨 코드 줄은 논리적이지 않았습니다.너무 큰 문자열에는 문제가 없었습니다."foo"로 변경했는데도 오류 14가 계속 발생하는 간단한 할당이었습니다.XP에서 오류가 잘못 매핑된 것 같습니다.우리의 대답은 Armadillo 보호 프로젝트에서 copyMem-11을 제거하고 exe를 다시 래핑하는 것이었습니다.

문자열을 자주 추가하는 것 같습니다.당신은 StringBuilder 클래스

또한 사용되지 않고 해제되어야 하는 문자열이 포함된 오래된 개체가 있을 수도 있습니다.객체 할당/해제를 기록하여 순환 참조를 확인하세요. Class_Initialize/Class_Finalize

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top