Listener 인터페이스 추가가 필요한 구현 등의 virtual function 사용시 주의가 필요하다. pure virtual 로 지정해주거나 구현부가 존재하면 당연히 문제없이 빌드 및 실행이 되겠지만, 그렇지 않은 경우에는 빌드 에러없이 앱 인스톨 후 실행시점에서 바로 앱크래쉬가 발생한다. 

App crash Info Downloading

crashinfo.txt, stackFrame.txt 로그를 봐서는 해당원인을 찾을 수 없고, 해당 프로젝트가 어느정도 진행이 되면서 소스가 늘어난 상태라면 virtual function 문제임을 파악하기는 더 까다로워진다.


PROBLEM


아래 코드의 경우, ThreadImplListener 의 OnRun 에서의 링크 에러 없이 정상 빌드되고, 앱 실행시 크래쉬 되는 문제가 발생한다. 

class ThreadImplListener {
public:
   virtual void OnRun(void);
};
class TestForm : public ThreadImplListener {
public:
   virtual void OnRun(void);
}

void TestForm::OnRun(void)
{
   // Do something...
}


SOLUTION


pure virtual 로 지정 해주거나 구현부를 선언해주자.

class ThreadImplListener {
public:
   virtual void OnRun(void) = 0;
};
class ThreadImplListener {
public:
   virtual void OnRun(void) {}
};


...


그렇다. 바다 개발을 하면서 이런 링크 에러를 기대하는 건 사치다. 

댓글
댓글쓰기 폼