|
원래 그렇습니다.
아래의 경우
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 까지 같이 바뀌는 것일까요?
|