簡體   English   中英

在 Visual C++ 2005 中開發的 Visual C++ 項目 - 在 Visual C++ 2010 中,調試斷言在菜單打開時失敗,但修復模式如何工作?

[英]Visual C++ project developed in Visual C++ 2005 - In Visual C++ 2010, debug assertion fails on menu open, but release mode works, how to fix?

我剛剛開始研究一個項目,該項目是由其他人使用 MFC 在 Visual C++ 2005 中開發的。 為此,我安裝了 Visual C++ 2010 - 我沒有使用這兩個版本(或者根本沒有使用 Visual Studio 的經驗)。

該應用程序有一個使用CMenu class 實現的菜單欄,並從資源初始化(即,使用菜單編輯器創建)。

如果我在調試模式下運行應用程序,只要我打開菜單欄中的任何菜單,以下調試斷言就會失敗:

文件名: afxwin1.inl

斷言(帶有適當的上下文):



    _AFXWIN_INLINE HMENU CMenu::GetSafeHmenu() const
        { ASSERT(this == NULL || m_hMenu == NULL || ::IsMenu(m_hMenu));
            return this == NULL ? NULL : m_hMenu; }

根據調試器, this設置為指向我的菜單的指針,並且this->m_hMenu也設置為指針 - 但是,調試器似乎對類型感到困惑,值為0xdeadbeef {unused=??? } (當然,對於更無聊的0xdeadbeef0xdeadbeef {unused=??? }

似乎有些東西壞了,而且很可能在項目代碼中——我知道這一點。 但是,如果我創建一個發布版本,它運行時不會出現錯誤,並且菜單會正確顯示。 此外,我使用 Visual C++ 2010 中的菜單編輯器編輯了菜單,並保存了它 - 沒有任何變化。 因此,我排除了資源格式錯誤導致的菜單兼容性問題。

我在 ThinkPad T61p 上運行 Windows XP SP3。

創建菜單的代碼是



    CMenu menu;
    menu.LoadMenu(RESOURCE_NAME);
    SetMenu(&menu);

並在CFrameWnd的子類的上下文中運行。

我已經搜索了很多谷歌,並且相當確定以前沒有人遇到過這個問題; 另外,我是 C++、MFC 和 Visual Studio 的新手。 非常感謝您的幫助; 如果我可以提供更多問題元數據,請告訴我,我會這樣做。 提前致謝!

根據 MSDN (http://msdn.microsoft.com/en-us/library/177ay1x0.aspx)

CMenu::LoadMenu() 需要傳入一個參數,您的示例代碼中缺少該參數。 請檢查並確保您傳遞了有效的菜單資源ID。

編輯:

您的菜單 object 是在堆棧上構建的,一旦退出 scope 就會被銷毀。 你從哪里調用你的 CWnd::SetMenu ? 您需要確保 object 的壽命可以持續到下一個 CWnd::SetMenu 否則您將持有/引用一個懸空指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM