STDMETHODIMP UAC::Copy(BSTR from, BSTR to, VARIANT_BOOL overwrite)
{
LPCTSTR from_path = _bstr_t(from);
LPCTSTR to_path = _bstr_t(to);
::CopyFile(from_path, to_path, (overwrite == VARIANT_TRUE));
return HRESULT_FROM_WIN32(::GetLastError());
}
{
LPCTSTR from_path = _bstr_t(from);
LPCTSTR to_path = _bstr_t(to);
::CopyFile(from_path, to_path, (overwrite == VARIANT_TRUE));
return HRESULT_FROM_WIN32(::GetLastError());
}
오늘 위와 같은 비스타 관련 테스트 모듈 작성 중 _bstr_t() 객체를 이용한 캐스팅 중
이상한 현상 하나를 발견하였다.
그 증상은 다음과 같다.
1. 진입



위의 현상으로 보았을 때 _bstr_t()의 임시 객체 사이에 메모리 공유를 하는 듯 보인다.
이에 대한 자세한 이유는 각자 해부해 보기를... -_-a
휘릭~
< 추가 : 2007/02/23 >
위와 같은 에러의 이유는 객체가 유지되는 scope에 대한 무지의 소치에서 비롯 되었다.
위의 코드에서 임시객체 _bstr_t(from) 과 _bstr_t(to)가 유지되는 영역은
Copy() 함수 내부가 아닌 임시객체가 선언된 그 라인이다.
디버거로 살펴보면 라인을 벗어남과 동시에 소멸자가 호출 되면서 메모리를 해제하는 것을 알 수 있다.
위와 같은 상황에서 추측할 수 있는 것은
_bstr_t 가 자신만의 메모리풀을 생성해서 그것을 재활용 하는 것이 아닌가라는 의심을 하게 된다.
실제로 두 포인터가 가리키는 메모리 주소가 동일하다.
위와 같은 에러의 이유는 객체가 유지되는 scope에 대한 무지의 소치에서 비롯 되었다.
위의 코드에서 임시객체 _bstr_t(from) 과 _bstr_t(to)가 유지되는 영역은
Copy() 함수 내부가 아닌 임시객체가 선언된 그 라인이다.
디버거로 살펴보면 라인을 벗어남과 동시에 소멸자가 호출 되면서 메모리를 해제하는 것을 알 수 있다.
위와 같은 상황에서 추측할 수 있는 것은
_bstr_t 가 자신만의 메모리풀을 생성해서 그것을 재활용 하는 것이 아닌가라는 의심을 하게 된다.
실제로 두 포인터가 가리키는 메모리 주소가 동일하다.


::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::
그래서 정확한 원인이 뭐죠? -_-;;
ㅋㅋㅋ
정확한 원인은 _bstr_t() 객체의 임시 생성 scope가 잘못되었단 거죠.