'casting'에 해당되는 글 1건

  1. [2007/02/20] _bstr_t()를 이용한 char* (or wchar*) 캐스팅 유의 점 (2)

_bstr_t()를 이용한 char* (or wchar*) 캐스팅 유의 점

[프로그래밍 팁/윈도우 프로그래밍]
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());
}

오늘 위와 같은 비스타 관련 테스트 모듈 작성 중 _bstr_t() 객체를 이용한 캐스팅 중
이상한 현상 하나를 발견하였다.
그 증상은 다음과 같다.

1. 진입
2. LPCTSTR from_path = _bstr(from);
3. LPCTSTR to_path = _bstr(to);

위의 현상으로 보았을 때 _bstr_t()의 임시 객체 사이에 메모리 공유를 하는 듯 보인다.
이에 대한 자세한 이유는 각자 해부해 보기를... -_-a
휘릭~

< 추가 : 2007/02/23 >

위와 같은 에러의 이유는 객체가 유지되는 scope에 대한 무지의 소치에서 비롯 되었다.
위의 코드에서 임시객체 _bstr_t(from) 과 _bstr_t(to)가 유지되는 영역은
Copy() 함수 내부가 아닌 임시객체가 선언된 그 라인이다.
디버거로 살펴보면 라인을 벗어남과 동시에 소멸자가 호출 되면서 메모리를 해제하는 것을 알 수 있다.

위와 같은 상황에서 추측할 수 있는 것은
_bstr_t 가 자신만의 메모리풀을 생성해서 그것을 재활용 하는 것이 아닌가라는 의심을 하게 된다.
실제로 두 포인터가 가리키는 메모리 주소가 동일하다.
2007/02/20 14:35 2007/02/20 14:35