这个异常有时出现,有时不出现,但异常信息都是一样的,调了半天没结果,快烦死了。
那位老大看看。
下面是调试信息。
NTDLL! 77fa018d()
_CrtDbgReport(int 2, const char * 0x5f4ccd90 THIS_FILE, int 2120, const char * 0x00000000, const char * 0x00000000) line 353
AfxAssertFailedLine(const char * 0x5f4ccd90 THIS_FILE, int 2120) line 39 + 20 bytes
AfxAssertValidObject(const CObject * 0x00f04a80 {CObject}, const char * 0x5f4ccd90 THIS_FILE, int 2120) line 95 + 13 bytes
CFrameWnd::AssertValid() line 2121
CMainFrame::AssertValid() line 245
AfxAssertValidObject(const CObject * 0x00ef6eb8 {CMainFrame hWnd=0x000b0238}, const char * 0x5f4cccf0 THIS_FILE, int 2153) line 108
CWnd::GetTopLevelParent() line 2155
CFrameWnd::BeginModalState() line 351 + 8 bytes
CFrameWnd::OnEnable(int 0) line 463
CWnd::OnWndMsg(unsigned int 10, unsigned int 0, long 0, long * 0x0012adf4) line 1829
CWnd::WindowProc(unsigned int 10, unsigned int 0, long 0) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00ef6eb8 {CMainFrame hWnd=0x000b0238}, HWND__ * 0x000b0238, unsigned int 10, unsigned int 0, long 0) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x000b0238, unsigned int 10, unsigned int 0, long 0) line 368
AfxWndProcBase(HWND__ * 0x000b0238, unsigned int 10, unsigned int 0, long 0) line 220 + 21 bytes
USER32! 77df2e98()
USER32! 77df39a3()
USER32! 77df395f()
NTDLL! 77fa032f()
USER32! 77e11d98()
USER32! 77e117d1()
USER32! 77e1231e()
USER32! 77e1766c()
USER32! 77e175f9()
__crtMessageBoxA(const char * 0x0012b474, const char * 0x1024e89c `string', unsigned int 73746) line 65
CrtMessageWindow(int 2, const char * 0x5f4ccd90 THIS_FILE, const char * 0x0012c5a8, const char * 0x00000000, const char * 0x0012e5cc) line 520 + 22 bytes
_CrtDbgReport(int 2, const char * 0x5f4ccd90 THIS_FILE, int 2120, const char * 0x00000000, const char * 0x00000000) line 419 + 76 bytes
AfxAssertFailedLine(const char * 0x5f4ccd90 THIS_FILE, int 2120) line 39 + 20 bytes
AfxAssertValidObject(const CObject * 0x00f04a80 {CObject}, const char * 0x5f4ccd90 THIS_FILE, int 2120) line 95 + 13 bytes
CFrameWnd::AssertValid() line 2121
CMainFrame::AssertValid() line 245
AfxAssertValidObject(const CObject * 0x00ef6eb8 {CMainFrame hWnd=0x000b0238}, const char * 0x5f4cd8a0 THIS_FILE, int 2308) line 108
CSplitterWnd::GetActivePane(int * 0x00000000, int * 0x00000000) line 2309
CMainFrame::OnCmdMsg(unsigned int 59392, int 5177342, void * 0x0012f764, AFX_CMDHANDLERINFO * 0x00000000) line 284 + 30 bytes
CWnd::OnNotify(unsigned int 59392, long 1243784, long * 0x0012f850) line 2114
CWnd::OnWndMsg(unsigned int 78, unsigned int 59392, long 1243784, long * 0x0012f894) line 1609 + 40 bytes
CWnd::WindowProc(unsigned int 78, unsigned int 59392, long 1243784) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00ef6eb8 {CMainFrame hWnd=0x000b0238}, HWND__ * 0x000b0238, unsigned int 78, unsigned int 59392, long 1243784) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x000b0238, unsigned int 78, unsigned int 59392, long 1243784) line 368
AfxWndProcBase(HWND__ * 0x000b0238, unsigned int 78, unsigned int 59392, long 1243784) line 220 + 21 bytes
USER32! 77df2e98()
USER32! 77df4876()
USER32! 77df5b27()
COMCTL32! 77b35e95()
COMCTL32! 77b8628d()
COMCTL32! 77b5b44b()
USER32! 77df2e98()
USER32! 77df6a72()
USER32! 77df6aee()
CWnd::DefWindowProcA(unsigned int 514, unsigned int 0, long 1900577) line 1000 + 32 bytes
CWnd::WindowProc(unsigned int 514, unsigned int 0, long 1900577) line 1586 + 26 bytes
CControlBar::WindowProc(unsigned int 514, unsigned int 0, long 1900577) line 470 + 20 bytes
AfxCallWndProc(CWnd * 0x00ef700c {CToolBar hWnd=0x002101ce}, HWND__ * 0x002101ce, unsigned int 514, unsigned int 0, long 1900577) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x002101ce, unsigned int 514, unsigned int 0, long 1900577) line 368
AfxWndProcBase(HWND__ * 0x002101ce, unsigned int 514, unsigned int 0, long 1900577) line 220 + 21 bytes
USER32! 77df2e98()
USER32! 77df30e0()
USER32! 77df320f()
USER32! 77e0209d()
CWnd::IsDialogMessageA(tagMSG * 0x0046c700 {msg=0x00000203 wp=0x00000001 lp=0x001c0041}) line 182
CWnd::PreTranslateInput(tagMSG * 0x0046c700 {msg=0x00000203 wp=0x00000001 lp=0x001c0041}) line 3424
CControlBar::PreTranslateMessage(tagMSG * 0x0046c700 {msg=0x00000203 wp=0x00000001 lp=0x001c0041}) line 424
CWnd::WalkPreTranslateTree(HWND__ * 0x000b0238, tagMSG * 0x0046c700 {msg=0x00000203 wp=0x00000001 lp=0x001c0041}) line 2667 + 18 bytes
CWinThread::PreTranslateMessage(tagMSG * 0x0046c700 {msg=0x00000203 wp=0x00000001 lp=0x001c0041}) line 665 + 18 bytes
CWinThread::PumpMessage() line 841 + 30 bytes
CWinThread::Run() line 480 + 11 bytes
CWinApp::Run() line 400
AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x001338c3, int 1) line 49 + 11 bytes
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x001338c3, int 1) line 30
WinMainCRTStartup() line 330 + 54 bytes
KERNEL32! 77e77d08()

解决方案 »

  1.   

    不是错误,是异常,可能是一个错误引起的,最后停在这里了
    ASSERT(sizeof(CObject) == sizeof(void*));
    if (!AfxIsValidAddress(*(void**)pOb, sizeof(void*), FALSE))
    {
    TRACE0("ASSERT_VALID fails with illegal vtable pointer.\n");
    if (AfxAssertFailedLine(lpszFileName, nLine))
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    AfxDebugBreak();
    return;     // quick escape
    }但我看不出,为什么这里会出错啊
      

  2.   

    据我所知,sizeof操作符不能对void *进行操作,无意义.
      

  3.   

    看msdn,AfxIsValidAddress检查*pOb处的内存能不能读写。
    由此可见,*pOb为野指针。
      

  4.   

    哦,不,这不是我的代码,是CFrameWnd::AssertValid() 引出来的调试代码.
    这个是真正确无疑的。
      

  5.   

    这行语句
    ASSERT(sizeof(CObject) == sizeof(void*));是不时你写的?似乎不大可能成立,sizeof(void *)==4,sizeof(CObject)不可能等于4吧?因为虚函数表的指针就有4个字节。这样的错误是因为弹出assert对话框后,导致窗口重画,又在窗口重画的时候出现异常。
      

  6.   

    是野指针吧,你看看MFC里面的信息,
    ASSERT(sizeof(CObject) == sizeof(void*));
    if (!AfxIsValidAddress(*(void**)pOb, sizeof(void*), FALSE))
    {
    TRACE0("ASSERT_VALID fails with illegal vtable 
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    pointer.\n");我还不知道这个指针从哪里来的。是n个消息转发之后就出错了。消息也不是我发出来。