Debug Assertion Failed!


 原文 Debug   Assertion   Failed!  

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備注>>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM