您好,登錄后才能下訂單哦!
場景
調用wxTimer定時器功能的時候,如果關閉當前的窗口,會出現上述的問題:0xC0000005: 讀取位置 0xFEEEFF06 時發生訪問沖突
說明
跟蹤調用堆棧的具體情況,代碼崩潰點指向IMPLEMENT_APP(CTestApp)
調用堆棧指向:
wxEntry(int &,wchar_t * *) 未知
wxEntry(struct HINSTANCE__ *,struct HINSTANCE__ *,char *,int) 未知
> WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) 行 4 C++
__tmainCRTStartup() 行 528 C
經驗
如果只是根據這些信息,顯然沒有任何的實際意義,從而引出下文的重點:當出現程序崩潰的時候,需要從當前的堆棧信息,不斷的從最新的函數調用往前進行回溯,指向WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow) 行 4 C++這一句的指針式白色的,而在調用堆棧的列表上,還有其他的信息,尤其是最前面的×××的指針指向的內容:wxEvtHandler::SafelyProcessEvent(class wxEvent &)未知,經過不斷的回溯,才知道是wxTimerImpl發生錯誤,明顯的這是一個定時器,而在程序中確實使用了定時器,現在已經鎖定了目標,分析問題就不會太難了。之前沒有分析出問題,就是沒有逐一分析調用堆棧,看不懂系統調用沒有關系,關鍵是哪些用戶的調用會觸發系統的調用從而導致問題的出現
跟蹤調用堆棧
wxEvtHandler::SafelyProcessEvent(class wxEvent &)未知
wxTimerImpl::SendEvent(void)未知
wxTimerWndProc(struct HWND__ *,unsigned int,unsigned int,long)未知
說明在定時器處理消息的時候出現了問題,此時關閉窗口,應該已經銷毀了定時器的實例指針,這個時候定時器應該接收不到任何的消息,但是從調用堆棧來看,定時器內部還是繼續在處理消息,導致了問題的出現
查看代碼
聲明:wxTimer *m_timer;
創建對象:m_timer = new wxTimer(this, TIMER_ID);
啟動定時器:m_timer->Start(10);
結論
這里就有一個問題了,沒有停止定時器,但是就算沒有停止,發生的最終原因又是為何?當然了,通過在關閉窗口之前,調用m_timer->Stop(),停止定時器,解決了該問題
擴展
class WXDLLIMPEXP_BASE wxTimer : public wxEvtHandler
class WXDLLIMPEXP_BASE wxEvtHandler : public wxObject
, public wxTrackable
從上面看到定時器的繼承關系
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。