C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[42178] Re:AnsiString의 Delete에 버그가 있나요?
박지훈.임프 [cbuilder] 1264 읽음    2005-10-17 22:17
제가 아는 한에는 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];
:     }
: 무엇이 문제인지 아시는 분 있으신가요?

+ -

관련 글 리스트
42160 AnsiString의 Delete에 버그가 있나요? alberddo 941 2005/10/16
42178     Re:AnsiString의 Delete에 버그가 있나요? 박지훈.임프 1264 2005/10/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.