我这个vs2010 有一个小问题,有人遇到过么(100分噢)
比如我写这么两句 我写在 OnMouseMove中的。
CClassXXXX *pClassXXXX=NULL;
pClassXXXX->DoSomeThing();
debug下运行,一定会报错。
在vc6中系统会自动停止在报错那一行。就是pClassXXXX->DoSomeThing();然后调用堆栈也是能看到这一行。
可是在vs2010中这个简单的指针为空的问题。竟然找不到报错的具体位置。调用堆栈也是像下面这样。乱糟糟的。
什么原因呢,是mfc的架构给改变了么。
>mfc100d.dll!ATL::ShouldTraceOutput(unsigned long dwModule, unsigned long dwCategory, unsigned int nLevel, const CAtlTraceCategory * * ppCategory, int (int, const char *, int, const char *, const char *, <no type>)* * pfnCrtDbgReport) 行 648 + 0x11 字节C++
mfc100d.dll!AtlTraceVA(unsigned long dwModule, const char * pszFileName, int nLine, unsigned long dwCategory, unsigned int nLevel, const char * pszFormat, char * ptr) 行 387 + 0x19 字节C++
cccccccc()
mfc100d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) 行 2495C++
mfc100d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) 行 2067 + 0x20 字节C++
mfc100d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) 行 248 + 0x1c 字节C++
mfc100d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) 行 411C++
mfc100d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) 行 420 + 0x15 字节C++
[解决办法]
堆栈里面不用看系统代码,只看自己的代码就行。类似这样的问题可以很快找到位置
[解决办法]
这不是MFC的问题,可能是编译器的问题,可能是某些编译选项改变了。
[解决办法]
pClassXXXX->DoSomeThing();就算pClassXXXX=0也不是有错误的。
class里面的成员函数的调用方式是thiscall,这样使用只是this指针为0
如果函数里面会检查this指针这个函数不会有任何问题。
例如:
CWnd* pc = NULL;
pc->GetSafeHwnd();// 无错误
pc->m_hWnd;// 这句会提示非法访问
// mov ecx, this
// mov ebx, dowrd ptr [ecx + m_hWnd]