VC++調程序出現如下錯誤:
Debug Assertion Failed! Program: D:\wyuStud\debug\wyuStud.exe File: afx.inl Line:157
可能問題:1.野指針;2.內存泄露 解決方法:
1.看一看你的程序里是不是有ASSERT()或VERIFY()語句。這兩個宏是用來測試它的參數是否為真的。出現你說的,這說明你的指針或表達試有問題
2.File: afx.inl Line:157 打開看看就知道了
3.vc++中遇到過此問題,在release下回忽略此問題,其實就是野指針的問題,在release版本下不用關心這個問題,也就是系統幫你給屏蔽了,但是問題還是存在的,真正使用的時候,偶爾會出來給你報個小錯。創建窗體等的時候沒有new,但是在析構的時候delete了,就會在debug環境下,報這樣的錯誤。打開"編譯"->"配置"->"把里面除了release其他的選項全部刪除,再構件就OK了 4.首先如果你用的是vc6的話: a.按F5運行你的程序 b.在出錯時,選擇“重試” c.按ALT+7調出“調用棧”窗口 d.雙擊從上往下的最近一個自己定義的函數,系統會自動把該函數所在的文件顯示出來,此時程序就暫停在光標處。一般來說錯誤就出在這附近。你可以通過查看變量的值來確認
5.可以先聲明一個臨時的CString變量然后作為暫存,然后把你取得的值放入其中,之后再賦給另一個你要使用的變量,即可解決問題
6.可能是在編寫函數調用指針變量時沒有分配空間(如果是在類中定義的指針變量,則指針在多個函數中引用時要分別重新分配空間),檢查一下。 7.類似的問題,可能是因為輸出對象創建不成功,於是使用的時候用的就是空的對象,於是就出現問題了。
8.“build->clean”
9."Project"->"setting"->"點擊c/c++"->"Category選項中選擇Preprocessor" ->"在Undefined symbols:填寫_DEBUG" 重新編譯運行即可
10.我是在做一個ActiveX控件的時候遇到的,由於是初學者, 所以在一個事件處理函數中這些輕率的寫: ClassMyControl pControl; pControl.f1(); 這些就會出現那個錯誤,改完Release后雖然異常被屏蔽了,但卻直接退出了,解決方法是,聲明一個ActiveX控件對象后,還要創建才能正在創建。 pControl.Create(``````); pControl.f1(); OK!!!
找到代碼(這個是VS2010版本的,各個版本會有所不同,可能不是在第329行,但是都是這個意思),如下
BOOL CWnd::ShowWindow(int nCmdShow) { ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));//這個就是VS2010版本的329行,錯誤在此
if (m_pCtrlSite == NULL) return ::ShowWindow(m_hWnd, nCmdShow); else return m_pCtrlSite->ShowWindow(nCmdShow); }
錯誤原因分析:
找到錯誤原因,下面就看下代碼是怎么寫的,怎么會造成的?
void CkgDlg::OnBnClickedStatusBtn() { if(home_stata_) { m_html_home.MoveWindow(33,107,660,466); m_html_home.ShowWindow(SW_SHOW);
// ::MoveWindow(m_html_home.m_hWnd,33,107,660,466,1); // ::ShowWindow(m_html_home.m_hWnd,SW_SHOW);
home_stata_=false; } else { m_html_home.MoveWindow(33,107,660,66); m_html_home.ShowWindow(SW_HIDE);
// ::MoveWindow(m_html_home.m_hWnd,33,107,660,66,1); // ::ShowWindow(m_html_home.m_hWnd,SW_HIDE);
home_stata_=true; } }
解決辦法:
void CkgDlg::OnBnClickedStatusBtn() { if(home_stata_) { // m_html_home.MoveWindow(33,107,660,466); // m_html_home.ShowWindow(SW_SHOW);
::MoveWindow(m_html_home.m_hWnd,33,107,660,466,1); ::ShowWindow(m_html_home.m_hWnd,SW_SHOW);
home_stata_=false; } else { // m_html_home.MoveWindow(33,107,660,66); // m_html_home.ShowWindow(SW_HIDE);
::MoveWindow(m_html_home.m_hWnd,33,107,660,66,1); ::ShowWindow(m_html_home.m_hWnd,SW_HIDE);
home_stata_=true; } }
為什么錯?是因為用了MFC,
為什么對?是因為用了API.
真正原因是什么呢,是因為API傳進去的句柄是這個控件的句柄,即控件->m_hWnd,而MFC傳進去的句柄是此類(即CkgDlg類)的句柄,即this->m_hWnd.
還有一點需要注意的是,可能在Release版本有時會運行正常,就僥幸這樣用了,其實不管是Release版本還是Debug版本,都必須用上面的辦法處理,如果你要控制某一個控件,那么你就傳它對應的句柄,不要傳別人的句柄進去
附注1:關於怎樣理解斷言錯誤,ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));可以參考本博客<<MoveWindow下出現Debug Assertion Failed!----例2_55備注>>
