动态生产的控件在RELEASE下响应消息时发生ACCESS VIOLATION 错误

_microsoft 2008-06-06 06:32:42
在DEBUG下面运行一直没问题,RELEASE下面会出错。错在动态创建的控件响应消息的时候,控件包括COMBOBOX,EDIT,响应的消息有SEL_CHANGE,EN_CHANGE,相关代码如下:
ccombobox* m_checkcombobox = new CCheckComboBox();
if ((m_nLeft+130)>(m_iWidth))
{
m_nLeft = LEFT_BORDER;
m_nTop += m_iCurrentHeight + 10;
}
CRect rec = CRect(m_nLeft,m_nTop,(m_nLeft+120),(m_nTop+100));
m_nLeft+=130;
if(!m_checkcombobox->Create(dstyle|WS_VSCROLL,rec,this,m_IChkListNo++))
{
TRACE0("Failed to create output view-----\n");
return false;
}
m_checkcombobox = NULL;

响应消息的函数里面:

for (j = ID_DYNAMIC_CHECKLIST_START;j< ID_DYNAMIC_CHECKLIST_END;j++)
{
CString strtmp = "";
if ((CWnd*)GetDlgItem(j)!= NULL)
{
CStringArray strarr;
((CCheckComboBox*)GetDlgItem(j))->GetCheckString(&strarr);

..........
这句代码是改过的if ((CWnd*)GetDlgItem(j)!= NULL),原来是if (GetDlgItem(j)!= NULL),一样会出错。
而且RELEASE不能编译成带调试信息的,不能具体定位到具体哪一行,但是可以肯定的是在下拉框可以弹出来,一选择值就出错了,就是ACCESS VIOLATION.
...全文
101 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
_microsoft 2008-06-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 _microsoft 的回复:]
引用 2 楼 zgl7903 的回复:
1
ccombobox* m_checkcombobox = new
m_checkcombobox = NULL;
用完了就置0,以后释放如何操作的

2 ID_DYNAMIC_CHECKLIST_START ID_DYNAMIC_CHECKLIST_END
和 m_IChkListNo 的关系是啥样的

3 CCheckComboBox 和 ccombobox 是什么关系
为什么创建时候用 ccombobox ,而使用的时候又用 CCheckComboBox

1. for (k = m_IChkListNo;k < ID_DYNAMIC_CHECKLIST_END;k++)
{
i…
[/Quote]
今天早晨上班路上我也想到可能是这个的问题了,只是还不确定,果然如此。
ouyh12345 2008-06-09
  • 打赏
  • 举报
回复
而且RELEASE不能编译成带调试信息的,不能具体定位到具体哪一行,但是可以肯定的是在下拉框可以弹出来,一选择值就出错了,就是ACCESS VIOLATION.

生成pdb符号文件,然后用windbg运行
zgl7903 2008-06-09
  • 打赏
  • 举报
回复
DestroyWindow 只是销毁窗口,但是并不能释放 new 分配的内容

for (k = ID_DYNAMIC_CHECKLIST_START ;k < ID_DYNAMIC_CHECKLIST_END;k++)
{
CWnd *pWnd = GetDlgItem(k);
if ( pWnd )
{
if(pWnd->m_hWnd)
GetDlgItem(k)->DestroyWindow();
delete (CCheckComboBox *)pWnd;
}
}

另外 先测试 CCheckComboBox 是否工作正常
_microsoft 2008-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zgl7903 的回复:]
1
ccombobox* m_checkcombobox = new
m_checkcombobox = NULL;
用完了就置0,以后释放如何操作的

2 ID_DYNAMIC_CHECKLIST_START ID_DYNAMIC_CHECKLIST_END
和 m_IChkListNo 的关系是啥样的

3 CCheckComboBox 和 ccombobox 是什么关系
为什么创建时候用 ccombobox ,而使用的时候又用 CCheckComboBox
[/Quote]
1. for (k = m_IChkListNo;k< ID_DYNAMIC_CHECKLIST_END;k++)
{
if ( GetDlgItem(k)!= NULL)
{
GetDlgItem(k)->DestroyWindow();
}
}
是这样释放的

2.m_IChkListNo 初始值为ID_DYNAMIC_CHECKLIST_START,最后要小于ID_DYNAMIC_CHECKLIST_END
3.这个是打错了,是帖子里手工加上的,定义里面是CCheckComboBox 。
谢谢
请指教!
zgl7903 2008-06-07
  • 打赏
  • 举报
回复
1
ccombobox* m_checkcombobox = new
m_checkcombobox = NULL;
用完了就置0,以后释放如何操作的

2 ID_DYNAMIC_CHECKLIST_START ID_DYNAMIC_CHECKLIST_END
和 m_IChkListNo 的关系是啥样的

3 CCheckComboBox 和 ccombobox 是什么关系
为什么创建时候用 ccombobox ,而使用的时候又用 CCheckComboBox
cppwin 2008-06-07
  • 打赏
  • 举报
回复
用 TRACE 或 写log 确定故障部位

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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