|
박근우 님이 쓰신 글 :
:
: 안녕하세요 C++을 공부하는 학생입니다.
:
: WideString의 += 연산자에 대해서 궁금한 것이 있어서 이렇게 질문을 드립니다.
: ------- 소스 시작 --------------
: WideString* pStr1 = new WideString("ABC"); <--- 1번
: WideString* pStr2 = new WideString("XYZ");
: WideString* pStr3 = pStr1;
:
: *pStr1 += pStr2; <--- 2번
:
: ------- 소스 끝 -------------
: 위의 결과는 ABCXYZ입니다.
:
: 그런데 제가 궁금한 것은요 1번 과 2번 에 있는데요
:
: 1번일때 pStr1의 주소값이랑 2번 이후의 pStr1의 주소값이 다릅니다.
:
: 제가 알기로는 같은 주소상에서 재할당이 되어야 하는게 아닌가 하거든요
:
: 1번에서의 pStr1의 주소가 100번지였다면 2번에서의 pStr1의 주소는 200번지입니다.
:
: 더더욱 이상한것은 pStr3의 주소도 역시 100번지에서 200번지로 바뀌어 있다는 것입니다.
:
: 제가 생각한 것은 pStr1이 원래 가리키던 주소 100번지에 ABCXYZ가 할당되고
:
: 이 할당된 영역은 초기에 할당한 영역보다 커서
:
: 예약하지 않은(new로 할당하지 않은) 공간까지 잠식하게 되는 것입니다.
:
: 그래서 결과적으로 memory aceess 관련 에러가 날 것이라 생각을 했는데
:
: 아예 새로운 주소로 가리키고 있다는 것입니다.
:
: ---------------------------------------------------------
:
: 저렇게 새로운 공간을 가리키게 되면 예전에 가리키고 있던 100번지의 내용은
:
: 자동으로 지워지는 지도 궁금합니다.
:
: 아시는 분 있으면 꼭 가르쳐 주세요
WideString* pStr1 = new WideString("ABC"); <--- 1번
WideString* pStr2 = new WideString("XYZ");
WideString* pStr3 = pStr1;
*pStr1 += pStr2; <--- 2번
WideString& __fastcall operator +=(const WideString& rhs);
2번은 *pStr1 += *pStr2;로 해야 합니다.
님이 말한 주소 관련 문제는 발생하지 않습니다.
만약 님이 pStr1 += pStr2;로 했다면 문제가 발생하지만....
그리고, += 연산으로 재할당되는 것은 WideString 인스턴트 자체가 아니라 내부의 문자열 버퍼(wchar_t *Data)입니다.
|