![](/img/trans.png)
[英]Runtime how to determine Debug or release mode in visual studio c++
[英]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=??? }
(當然,對於更無聊的0xdeadbeef
值0xdeadbeef {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.