2009-09-15 275 views
3

我有一個工作的MFC應用程序(一個對話框應用程序),我刪除了它的一些按鈕並添加了一個新按鈕,但現在當它關閉應用程序崩潰時。它在ASSERT()宏之一中失敗。調試斷言失敗,在這些線路上MFC應用程序在關閉時崩潰

文件:afxtempl.h 線:558

當我查看該代碼是這樣的

template<class TYPE, class ARG_TYPE> 
void CArray<TYPE, ARG_TYPE>::AssertValid() const 
{ 
    CObject::AssertValid(); 

    if (m_pData == NULL) 
    { 
     ASSERT(m_nSize == 0); 
     ASSERT(m_nMaxSize == 0); 
    } 
    else 
    { 
     // here it fails 
     ASSERT(m_nSize >= 0); 
     ASSERT(m_nMaxSize >= 0); 
     ASSERT(m_nSize <= m_nMaxSize); 
     ASSERT(AfxIsValidAddress(m_pData, m_nMaxSize * sizeof(TYPE))); 
    } 
} 
#endif //_DEBUG 

任何線索,什麼錯誤?早些時候應用程序工作正常,但我搞砸了。

+0

m_nSize的值是多少? – Naveen 2009-09-15 07:58:26

+0

從資源中刪除控件並不總是足夠的。也許有代碼仍然試圖使用它。 – 2009-09-15 08:10:54

回答

1

我想查看導致斷言的堆棧跟蹤中的內容 - 也是各種成員變量中的內容。例如,如果原因是雙重刪除,則在調試版本中,因爲調試分配器將內存釋放到此值,所以您希望在值中看到值0xddddddd。

0

當我不經意間得到了resource.h中定義的重複資源ID時,我已經看到了這樣的瘋狂事情。如果你唯一改變的是添加/刪除幾個按鈕,我會先檢查這個,然後嘗試一個完整的重建。

+0

多麼美妙的框架;) – jkp 2009-09-15 16:46:05

0

幾個月前我有同樣的問題 - MFC關閉時崩潰。後來發現,在一個析構函數中,我試圖刪除或釋放一些已經被刪除的內存,但不知何故在它之前通過了空的檢查。可能你可以檢查這一點。