MFC 多檔案視窗
CList里存的的是打開過的視窗的視窗指標,視窗關閉的時候并沒從Clist洗掉該視窗指標
在專案的另外一個地方需要遍歷該Clist 做一些其他操作
代碼如下
for (int i = 0; pos && i < (UINT)theApp.m_List.GetCount(); i++) {
pView = theApp.m_List.GetNext(pos);
if(pView && ::IsWindow(pView->m_hWnd))
{
pView->fun();....... //此處偶爾會造成野指標操作
}
在偶發情況下,視窗關閉后,遍歷以上代碼IsWindow()并沒有回傳FALSE 導致 以上代碼紅色部分會造成野指標操作。
哪位大神幫忙解釋下原因。
uj5u.com熱心網友回復:
沒看見全部代碼大致推測,
CView是對視窗的一個封裝,它的m_hwnd可能還在,但是CView卻被釋放了
uj5u.com熱心網友回復:
視窗關閉的時候 要把Clist中對應的視窗指標置 0uj5u.com熱心網友回復:
你遍歷View,應該通過檔案模板CDocTemplate來遍歷uj5u.com熱心網友回復:
可是我想知道為什么IsWindow(pView.m_hwnd)沒有判斷到視窗已經不存在了,這個情況不是每次都能發生,但是幾率也有點大uj5u.com熱心網友回復:
因為是想遍歷加過CList的那些視圖,而不想遍歷所有打開的視圖。
uj5u.com熱心網友回復:
什么情況下能出現你說的這種情況呢。我認為CView的生存周期是大于等于它的視窗的,也就是視窗銷毀時候它的類物件不一定銷毀,但是CView物件釋放時,它的視窗一定銷毀。
uj5u.com熱心網友回復:
你確定?建議了解一下Cwnd的Attach函式和DeAttach(記憶中是這個,有可能拼錯)uj5u.com熱心網友回復:
多執行緒/多行程 程式可能被中斷在任何時候, __try __catch 自己處理例外,以保證程式不奔潰uj5u.com熱心網友回復:
應該是pView問題,不是pView->m_hWnd的問題,CList在pView卸載后,你沒有同步的將對應的CList的Item清空uj5u.com熱心網友回復:
因為pView銷毀時 , (pView->m_hWnd) 并沒有隨著 m_hWnd 銷毀 而 改變。uj5u.com熱心網友回復:
句柄只是一個結構體指標,記錄視窗相關的資訊,視窗銷毀的時候,如果沒有closehandle,那么iswindow判斷應該是失效的。uj5u.com熱心網友回復:
https://msdn.microsoft.com/en-us/library/ms633528A thread should not use IsWindow for a window that it did not create because the window could be destroyed after this function was called. Further, because window handles are recycled the handle could even point to a different window.
視窗銷毀后,句柄可能重回圈利用
https://stackoverflow.com/questions/2344233/validate-hwnd-using-win32-api
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/78394.html
標籤:界面
上一篇:CImage 加載圖片的問題
