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?

本文关键字:Visual c++ 菜单 调试 失败 断言 2010 开发 2005 项目      更新时间:2023-10-16

我刚开始做一个别人用Visual c++ 2005使用MFC开发的项目。为此,我安装了Visual c++ 2010 -我没有使用任何版本的经验(或Visual studio,就此而言)。

应用程序有一个使用CMenu类实现的菜单栏,并从资源初始化(即使用菜单编辑器创建)。

如果我在调试模式下运行应用程序,那么只要我打开菜单栏中的任何菜单,下面的调试断言就会失败:

文件名: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的更无聊的值)。

似乎有什么东西坏了,很可能在项目代码中-我知道这一点。但是,如果我创建了一个发布版本,它运行时没有错误,并且菜单正确显示。此外,我使用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。

编辑:

你的菜单对象是在堆栈上构造的,一旦它超出作用域就会被销毁。你从哪里调用CWnd::SetMenu ?你需要确保对象的生命周期可以持续到下一个CWnd::SetMenu,否则你将持有/引用一个悬浮指针。