|
제가 아는 한에는 AnsiString에 그런 버그는 없습니다. 그리고 ERangeError는 에러라기보다는 정확히 말하자면 예외이기
때문에(뜻의 차이가 좀 미묘합니다만), ERangeError 예외를 만났을 때의 원인은 AnsiString에 있다기보다는 님의 코드에
있을 가능성이 거의 100%입니다.
AnsiString::Delete 함수에서는 주어진 객체가 어떠한 길이이든 관계없이 ERangeError 예외는 발생하지 않습니다.
예를 들어 ss 문자열에 "abcde"라고 들어있는 상태에서, 다음의 모든 예는 예외없이 그냥 넘어갑니다.
ss.Delete(1, 100);
ss.Delete(100, 200);
ss.Delete(100, -200);
그리고 말씀하신 경우에, 예외에서 OK를 누르면 operator []로 넘어간다고 하셨는데, 바로 이 [] 연산자가 ERangeError
예외를 발생시키는 단골 연산자입니다. ERangeError 예외는 ss 문자열 객체에 내용이 300개밖에 없는데 ss[301]을
액세스하려고 하면 발생합니다. 따라서 디버거가 strData.Delete(1, 4); 라인에서 예외를 발생시킨 걸로 보셨더라도
그 바로 앞 혹은 뒤에서 문자열에 [] 연산자를 쓴 곳에서 예외가 발생했을 것입니다.
그럼...
alberddo 님이 쓰신 글 :
: AnsiString의 Delete에 제약이 있나요?
: 괭장히 큰 Text Data를 해석하기 위해서 TStringList 100개 정도에 나누어 저장한 후에 TStringList에 저장된 값을 500자씩 나누어 읽고 AnsiString 저장후 해석하다가 300자보다 작으면 추가로 읽으면서 전체를 해석합니다.
: 그런데 strData.Delete(1, 4); 이 코드에서 에러가 나는 데 디버거로 보니 Delete하기 전 AnsiString에 저장된 값은 이상이 없었는 데 왜 에러가 발생하는 지 모르겠습니다.
:
: Project raised exception class ERangeError with message ''. 이 메시지가 뜨는 데 OK버튼을 선택하면
: 아래 함수로 들어갑니다.
: char& __fastcall operator [](const int idx)
: {
: ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ?? <==여기 idx값은 5
: Unique(); // Ensure we're not ref-counted
: return Data[idx-1];
: }
: 무엇이 문제인지 아시는 분 있으신가요?
|