2009년 05월 14일
다음코드의 차이점은???
아래 나오는 A 와 B의 차이점은 뭘까요?
/// A
int _tmain(int argc, _TCHAR* argv[])
{
NiInit();
NiStream kStream;
NiShutdown();
return 0;
}
/// B
int _tmain(int argc, _TCHAR* argv[])
{
NiInit();
{
NiStream kStream;
}
NiShutdown();
return 0;
}
결과를 말하자면
A는 정상종료를 하지 못합니다.
B는 정상종료됩니다.
대체 원인이 무엇인지 궁금해서 코드를 분석해봤습니다.
일단 분석결과는 NiStream 의 scope 문제 입니다.
GameBryo는 필요한 변수의 초기화및 할당 NiInit() 에서 합니다.
NiShutdown 을 통해서 모두 해제하구요.
NiShutdown 내부에는 스마트 포인터에 관련된 해제 처리도 포함되어있습니다.
그러다 보니 스마트 포인터 관련 처리가 정상 작동이 되려면
NiShutdown 호출 이전에 모두 마무리 되어야 하는것입니다.
헌데 NiStream 은 내부에 스마트 포인터를 멤버변수로 갖고 있습니다.
case A에서는 NiStream 의 소멸자가 호출 되긴 하는데
_tmain 을 벗어나야 호출이 되지요.
NiShutdown 호출 이후에 스마트 포인터 관련 처리를 하려고 하여 문제가 생겼던 것입니다.
-- 결론 --
게임브리오는 프로그래머블한 엔진. 자잘하게 신경써야할것이 많음.
# by | 2009/05/14 10:44 | GameBryo | 트랙백 | 덧글(0)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]