[완료] CString 의 복사에 대해서
글쓴이: sosuri78 / 작성시간: 화, 2008/01/15 - 2:45오후
아래 코드는 지역 변수를 생성한 후 그걸 전역변수에 할당합니다.
CString 에서 = 연산은 복사시 포인터만 넘긴다고 하는데, 이걸 전역변수에
복사해서 써도 문제가 없나요?
아래와 같은 메커니즘으로 돌아가도록 작성한 코드들이 있는데 돌아는 가는데 미심쩍어서 질문 드립니다.
CString name; void SetName(void) { CString temp = "FFFFFF"; name = temp; return; } int main(void) { SetName(); printf("name %s\n", (LPCSTR)name); }
CString 은 애매모호하네요 ㅠㅠ
Forums:
전역변수 객체에
전역변수 객체에 넣는 것은 전혀 문제되지 않습니다.
님이 말씀하신 문제가 되는 경우는 객체를 복사할 때 호출되는 '복사 생성자'가 전역변수를 이용하는
경우 다중 프로세서 환경에서 전역변수를 둘 이상이 동시에 사용하게 될 경우의 문제죠.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
문제 없습니다. 어떤
문제 없습니다.
어떤 원리인지는 모르겠지만, MSDN에서 CString에 대한 설명을 읽어보면 성능을 위해 처음 복사를 해서 같은 내용을 가리킬땐 말씀하신대로 메모리 할당을 하지 않고, 내용이 변경될때 메모리 할당을 하도록 구현되있다고 합니다.
감사합니다.
감사합니다.
저도 좀 찾아봤는데 http://www.sds.pe.kr/blog/395 에 보면 CString 의 복사 생성자에 대해서 설명이 나와있네요
SetName() 에서 생성한 CString temp 생성 시 nRef는 1 temp를 전역으로 복사할 때는 = 연산자를 통해 포인터만 복사된다구 합니다.
nRef 를 2로 증가시킴. SetName() 이 리턴할때 temp 가 소멸하는데 소멸자에서 nRef값을 보니 2라 1로 감소만 시키고 메모리 해제는 nRef가 0일대만 하므로 전역에서 가지고 있는 포인터는 아직도 유효하다고 합니다.
WinCE에 보니까 MFC 소스가 있네요 ^^ MFC 소스 보니까 좀 알겠습니다.
댓글 달기