【问题标题】:MFC Application Crashes while closingMFC 应用程序在关闭时崩溃
【发布时间】:2009-09-15 07:53:19
【问题描述】:

我有一个工作的 MFC 应用程序(一个对话框应用程序),我删除了它的一些按钮并添加了一个新按钮,但现在当它关闭时应用程序崩溃。它在 ASSERT() 宏之一中失败。调试断言在这些行上失败

文件: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

关于出了什么问题的任何线索?该应用程序在早些时候运行良好,但我搞砸了。

【问题讨论】:

  • m_nSize 的值是多少?
  • 从资源中删除控件并不总是足够的。也许有代码仍在尝试使用它。

标签: mfc assert crash


【解决方案1】:

我想查看导致断言的堆栈跟踪中的内容 - 以及各种成员变量中的内容。例如,如果原因是双重删除,那么在调试版本中,您会希望在值中看到值 0xdddddddd,因为调试分配器会将释放的内存设置为该值。

【讨论】:

    【解决方案2】:

    当我无意中在resource.h 中定义了重复的资源ID 时,我看到了这样的疯狂事情。如果您唯一更改的是添加/删除几个按钮,我会先检查一下,然后尝试完全重建。

    【讨论】:

      【解决方案3】:

      几个月前我遇到了同样的问题 - MFC 在关闭时崩溃。后来发现在析构函数中我试图删除或释放一些已经被删除但不知何故通过它之前的空检查的内存。也许你可以检查这一点。

      【讨论】:

        猜你喜欢
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        • 1970-01-01
        • 2015-09-02
        • 1970-01-01
        • 2013-01-02
        • 1970-01-01
        相关资源
        最近更新 更多