2013-07-15 4 views
0

MFC 응용 프로그램을 작성 중이며 CMFCRibbonStatusPane에서 공개적으로 파생 된 파생 클래스 CStatusBarPane을 만들었습니다. 메인 프레임을 만든 후 (상태 표시 줄과 함께 그 아이들이 나아가고)명백한 nullptr이없는 액세스 위반

virtual void SetStatusIcon(_In_ HICON hIcon) 
{ 
    m_hIconSmall = hIcon; 
    Redraw(); 
} 

, 나는 다음과 같은 함수를 호출 : 다음과 같이 파생 클래스는 간단한 방법을 포함하지만

void CMainFrame::UpdateStatusBar(_In_ const std::tstring& szStatus, _In_opt_ HICON hIcon) 
{ 
    CStatusBarPane* pStatusBarPane = static_cast<CStatusBarPane*>(m_wndStatusBar.GetElement(0)); 

    pStatusBarPane->SetText(szStatus.c_str()); 
    pStatusBarPane->SetStatusIcon(hIcon); 
} 

, Project.exe에 0x00000000의에서

첫 번째 예외 : 나는 응용 프로그램을 디버깅 할 때, 다음과 같은 문장으로 라인 pStatusBarPane->SetStatusIcon(hIcon)에 예외가 발생가 0xc0000005 : 액세스 위반 EXE를 절단 위치 0x00000000.

그러나 변수 추적에서 찾고 액세스하고 더 널 포인터가 없음을 보여주고, 그래서 내가 주소 0에서 액세스 위반이 있는지 이해할 수 없어요?

미리 감사드립니다.

답변

2

이 액세스 위반은 메모리 주소를 읽거나 쓰려고 시도하는 일반적인 유형이 아닙니다. 이 경우 오류는 주소 0x00000000에서 코드를 실행하려고 시도하는 것입니다. 그래서 이것은 주소가 널 포인터 인 함수를 호출하고 있음을 나타냅니다.

가장 확실한 설명은 m_wndStatusBar.GetElement(0)이 실제로는 CStatusBarPane*이 아닐 수 있습니다. 이 경우, SetStatusIcon이 가상 함수이기 때문에 코드는 m_wndStatusBar.GetElement(0)에서 vtable 조회를 수행하려고 시도 할 것입니다. 그리고 분명히 그것은 m_wndStatusBar.GetElement(0)이 정말로 당신이 생각하는 것일 때만 작동 할 수 있습니다.

+0

나는 단지 그렇게했다고 믿을 수 없다. 몇 번 확인해 보았습니다. 여기에서는 코드 생성 라인을 입력 할 때만 마침내 파생 클래스 대신 기본 클래스를 만들었습니다. 나는 바보 야, 고마워! –