[VC++] stringstream의 황당한 버그

정말 대단한 버그다!

회사 동료 분이 메모리 누수 현상이 있다길래 둘이 같이 달려들어 문제를 찾아봤는데, 천신만고 끝에 원인을 알아냈다.

wcout.imbue( locale("korean") );

wostringstream os;
for(int i=0; i<2; i++)
{
	os << _T("하이, ");
	os.flush();
	wcout << os.str() << endl;
}

이렇게 짜놓고 내가 기대하는 바는 당연히

하이,
하이, 

이럴 것이다. 하지만 실제 결과는 이와는 완전히 다르다.

하이,
하이, 하이, 

한마디로 flush가 flush 답게 작동하지 않는다는 게 문제다. 결국 flush가 되지 않고 문자열이 쌓이다 보니 메모리 누수가 일어나는 듯 보였던 것이다. 해결책을 보면 더 웃긴데, 솔직히 stringstream을 더 이상 쓰고 싶지 않을지도 모른다.

wcout.imbue( locale("korean") );

wostringstream os;
for(int i=0; i<2; i++)
{
	os << _T("하이, ");
	os.flush();
	wcout << os.str() << endl;
}

os.~wostringstream();
new ( (void *) &os ) std::wostringstream;

wcout << _T("Start") << endl;
wcout << os.str() << endl;
wcout << _T("End") << endl;

이렇게 하면 기대하던 결과가 나온다.

하이,
하이, 하이,
Start

End

황당한 해결책을 알려준 구세주 Gianni Mariani씨 왈,

The “str()” and “str( string )” methods should work.

However, on some platforms these may not work so you may use the ugly reconstruct hack.

최 재훈

블로그, 페이스북, 트위터 고성능 서버 엔진, 데이터베이스, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu