这段代码DEBUG阶段正常,但在生成RELEASE后运行却出错,为什么?

tjuwx 2004-01-06 10:30:51
我有一段根据文件动态生成弹出菜单的代码,在DEBUG阶段正常,但在生成RELEASE

版本后却在这段出错,报告<该内存不能为“read”>,为什么?

void CHexEditBase::OnContextMenu(CWnd*, CPoint cPoint)
{

BYTE milist[1500];
memset(milist, 0, 1500);

// Fill up the MENUITEMTEMPLATEHEADER structure.
MENUITEMTEMPLATEHEADER* mheader = (MENUITEMTEMPLATEHEADER*) milist;

mheader->versionNumber = 0;
mheader->offset = 0;

int bytes_used = sizeof(MENUITEMTEMPLATEHEADER);

// Add the following menu items to menu bar:
bytes_used += AddMenuItem(milist + bytes_used, L"POPUP", 0, TRUE, TRUE);
SearchAndFormatToMenu(m_nCurrentAddress,milist + bytes_used);

// Load resource from a menu template in memory.
CMenu cMenu;
ASSERT(cMenu.LoadMenuIndirect(milist));
CMenu *p = cMenu.GetSubMenu(0);

//POPUP menu
p->TrackPopupMenu(TPM_LEFTALIGN, cPoint.x, cPoint.y, this);

}

且去掉p->TrackPopupMenu(TPM_LEFTALIGN, cPoint.x, cPoint.y, this);后就不报错。
...全文
106 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
dTianx 2004-01-07
  • 打赏
  • 举报
回复
CMenu *p => CMenu p;
七伤拳 2004-01-07
  • 打赏
  • 举报
回复
既然将
ASSERT(cMenu.LoadMenuIndirect(milist));
改为
cMenu.Attach(::LoadMenuIndirect(milist));或cMenu.LoadMenuIndirect(milist);后release 版本就ok.
那问题就应该是解决了啊
alvachien 2004-01-07
  • 打赏
  • 举报
回复
ASSERT(cMenu.LoadMenuIndirect(milist));
=>
VERIFY(cMenu.LoadMenuIndirect(milist));

就OK
tjuwx 2004-01-07
  • 打赏
  • 举报
回复
to iLdf(七伤拳)

cMenu.Attach(::LoadMenuIndirect(milist));和cMenu.LoadMenuIndirect(milist);

是完全一样的,你说的是对的;

准确的说,情况是:

ASSERT(cMenu.LoadMenuIndirect(milist));

改为

cMenu.Attach(::LoadMenuIndirect(milist));或cMenu.LoadMenuIndirect(milist);

后release 版本就ok.

bluebohe 2004-01-06
  • 打赏
  • 举报
回复
tjuwx(wangxin)不是阿
ASSERT(cMenu.LoadMenuIndirect(milist));
应该为
cMenu.LoadMenuIndirect(milist);
ASSERT只起一个断言作用
tjuwx 2004-01-06
  • 打赏
  • 举报
回复
to iLdf(七伤拳)&lu_zi&bluebohe


ASSERT(cMenu.LoadMenuIndirect(milist));
改为
cMenu.Attach(::LoadMenuIndirect(milist));
后release版本也ok了


我不明白为什么ASSERT()会包含Attach()调用?
feiniaoliang 2004-01-06
  • 打赏
  • 举报
回复
sorry 发错了~~~~
feiniaoliang 2004-01-06
  • 打赏
  • 举报
回复
ri yo~~~~
七伤拳 2004-01-06
  • 打赏
  • 举报
回复
可以用 VERIFY 代替 ASSERT
bluebohe 2004-01-06
  • 打赏
  • 举报
回复
ASSERT里面不要写运行代码,这是经验之一
lu_zi 2004-01-06
  • 打赏
  • 举报
回复
对,我同意iLdf(七伤拳) 的看法,这么一小节程序,如果还不行,可以用替换法啊。哈哈
七伤拳 2004-01-06
  • 打赏
  • 举报
回复
问题出在 ASSERT(cMenu.LoadMenuIndirect(milist));

ASSERT 里面的语句只在DEBUG时才会执行,而release时是不会编译进来的
七伤拳 2004-01-06
  • 打赏
  • 举报
回复
楼上都是错误的,TrackPopupMenu函数是阻塞的,也就是只有在快捷菜单隐藏之后才会返回,CMenu cMenu 分配在栈上,不再使用快捷菜单之后才会销毁的。

可以写段代码调试一下便知。
tjuwx 2004-01-06
  • 打赏
  • 举报
回复
to victor_cui

我试了,不行,还出同样错误
jawibn 2004-01-06
  • 打赏
  • 举报
回复
victor_cui(夕阳)不错呀
flyelf 2004-01-06
  • 打赏
  • 举报
回复
在release版本中用AfxMessageBox跟踪一下一些关键变量
zhucde 2004-01-06
  • 打赏
  • 举报
回复
关于Debug不出错而Release出错的问题,
你可能搜索一下以前的帖子,FAQ和精华帖里也有,
好多帖子已经详细说明了它们的区别以前原因.

这里就不多帖子,
楼主自己搜索一下吧.
victor_cui 2004-01-06
  • 打赏
  • 举报
回复
CMenu cMenu;
是局部变量,在你调用的时候已经被释放,所以访问违例,debug版本有保护机制,所以没有出错,但是程序的确错了,最好把这个变量声明为类的成员变量,这样除非你的这个类实例被删除,否则不会出错,当然如果你的菜单生存期比这个类实例还要长的话,就得声明为全局变量了
七伤拳 2004-01-06
  • 打赏
  • 举报
回复
cMenu.Attach(::LoadMenuIndirect(milist));和cMenu.LoadMenuIndirect(milist);是完全一样的,这可以从MFC源代码上看得出来。

可能是其他部份的原因,你把源代码发给我看看,jxlilin@hotmail.com
tjuwx 2004-01-06
  • 打赏
  • 举报
回复
to iLdf(七伤拳)&bluebohe

我明白ASSERT本身只是宏,但为什么去掉Attach()调用写成

cMenu.LoadMenuIndirect(milist);

后release 版本就会出错?
加载更多回复(2)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧