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
[56728] Re:컴파일러 버그 일까요? 아니면 제가 모자란 것일까요?
장성호 [nasilso] 989 읽음    2009-04-23 13:19
원래 그렇습니다.
아래의 경우

AnsiString을 class입니다.
class 멤버로 실제 데이타가 있는 곳을 가리키는 포인터만 하나 가지고 있죠
(딱 4Byte 절대 더 커지지 않습니다.)


a=c;
b=c;
여기까지는 햇는 a와 b와 c 가 모두 가리키는 곳이 똑같습니다.
단 Refrence Count가 3이 되어있죠

만약 이중에 하나를 변경하면 변경되는 놈은 메모리를 새로 할당되구
기존에 값에서 RefCount가 하나 마이너스 되죠

예를 들어
b[2]='z';
뭐 이렇게 하면요

그런데 님께서는
포인터를 이용해서 직접 데이타를 수정했기때문에
AnsString 클래스에서 데이타를 변경했는지 알수가 없습니다.

그래서 여전히 Ref-Count 도 3이구 a ,b , c 모두 똑같은 값이 됩니다.

그러니까
a=c; //이렇게 할때 string이 copy되는게 아니라
string이 메모리 주소가 copy되구
실제string위치 -8 주소에 RefCount가 있는데 그놈이 ++될뿐입니다.


AnsiString에서 지원하는 배열( 인덱스가 0이 아닌  1부터 시작)을 이용해서 변경하면
b와 a가 다른 값이 될것입니다.

그럼..



김시환 님이 쓰신 글 :
: AnsiString  a,b,c ;
:
: c = "abcdef" ;
:
: a = c ;
: b = c ;
:
: b.c_str()[2] = 'z' ;
:
: 결과
:
: a = abzdef
: b = abzdef
:
: 왜 변수 b의 내용만 변경했는데 a 까지 같이 바뀌는 것일까요?

+ -

관련 글 리스트
56727 컴파일러 버그 일까요? 아니면 제가 모자란 것일까요? 김시환 948 2009/04/23
56728     Re:컴파일러 버그 일까요? 아니면 제가 모자란 것일까요? 장성호 989 2009/04/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.