3

動作中の 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

何がうまくいかないかについての手がかりはありますか?アプリケーションは以前は正常に動作していましたが、台無しにしました。

4

3 に答える 3

1

アサーションに至るまでのスタック トレースの内容と、さまざまなメンバー変数の内容を確認したいと思います。たとえば、原因が二重の削除である場合、デバッグ ビルドでは、デバッグ アロケータが解放されたメモリをこの値に設定するため、値に 0xdddddddd が表示されることが予想されます。

于 2009-09-15T08:43:29.143 に答える
0

数か月前、私は同じ種類の問題を抱えていました.MFCを閉じるとクラッシュします。後で、デストラクタで、すでに削除されているメモリを削除または解放しようとしていることがわかりましたが、その前にnullチェックを何らかの形で渡しました.この点を確認できるかもしれません.

于 2013-05-28T08:18:54.570 に答える