VS2008下基于对话框的退出问题问题

jamesony 2010-01-14 10:40:23
学习VC,想在在VC6.0下开发了一个小程序,程序是基于MFC对话框的,运行调试一切正常。由于后期想丰富程序的功能,
于是移植到了VS2008下,编译连接无错误,各项功能运行也正常,但是在程序退出的时候会弹出对话框,提示内存错误。不知道是哪出了问题,忘高手解惑,谢谢!

在调试的时候提示在

void AFXAPI AfxReleaseActCtx(HANDLE hActCtx)
{
if (pfnReleaseActCtx != 0)
{
pfnReleaseActCtx(hActCtx);
}
}
出错,谢谢各位帮忙看下.具体的代码我上传到了http://download.csdn.net/source/1992859,谢谢
...全文
395 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
luhongyu2108 2010-01-15
  • 打赏
  • 举报
回复
这个贴收藏了,楼主可以结贴了
jamesony 2010-01-15
  • 打赏
  • 举报
回复
谢谢marroc2005,呵呵,我之前也这样做过,不过到底没能坚持下去。长见识了,谢谢啊!
yujing_nsn 2010-01-15
  • 打赏
  • 举报
回复
来晚了
mhc20033167 2010-01-15
  • 打赏
  • 举报
回复

希望能看到更多的关于解决问题的思路
学习中!
呵呵!
marrco2005 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jamesony 的回复:]
引用 4 楼 marrco2005 的回复:
重新改了一下

marroc2005,非常感谢您的帮忙。我想问下您是如何定位到出错的地方的呢?谢谢
[/Quote]
找 bug 就像打猎一样,需要经验、耐心,还有一点点运气,呵呵。

你这个程序是在退出的时候崩溃的,调用堆栈里没有任何有用的信息,所以无法用ls的方法

找这个bug的思路是这样的:
首先将疑似有问题的函数注释掉,再运行程序,如果程序运行正常,那么问题就出在我们刚注释掉的那个函数里,重复上述步骤,逐渐缩小范围,直到定位到有问题的代码。


结合你的程序,具体步骤是这样的:
1 在 CProtocolAnalysisSystemApp::InitInstance() 函数中注释掉 CProtocolAnalysisSystemDlg dlg 的相关调用,这时程序能正常退出,问题出到 CProtocolAnalysisSystemDlg 类中

2 在 CProtocolAnalysisSystemDlg ::OnInitDialog 先将所有代码注释掉,只留下 MFC 自己的代码,再逐渐放开注释,最终发现 ShowTabWindow(m_tabMain) 函数有问题

3 当问题定位到 ShowTabWindow 函数时, 可以继续使用上面的方法, 发现 for 循环里面有问题,这时范围已经足够小了, 仔细分析一下代码,就可以找到问题所在了
不说害怕 2010-01-14
  • 打赏
  • 举报
回复
去看了下...名字很不错...需要两个分...
楼主的软件估计写的比较完全了.有12M源代码...
但出错时的堆栈窗口都不贴出来..
一般来说...是退出的时候有一句话出错..
zhucde 2010-01-14
  • 打赏
  • 举报
回复
哥们, 下载一下还要扣资源分啊?

不说害怕 2010-01-14
  • 打赏
  • 举报
回复
其实...可以F5调试运行.
关闭程序,等它出现错误框..
错误框上一般有个 重试,或者断下..
1.一般是自己写的MessageBox等就点击调试菜单里的暂停 调试..
2.是个错误框,那么点断下,或者重试,
假如重试,那么会继续跳出第二个框,一般是提示你是否需要断下. 点确定 停下来.
然后...调出 堆栈窗口. 堆栈窗口是倒置的(越上面是最新被调用的函数).
在堆栈窗口里往下找..直到一个自己的函数,或者自己填充过部分代码的函数..
一般是某个消息处理函数..

你双击它,进入,就会看到代码停在某一句...一般是那句或者上一句..出现错误..
这是直接引起错误的,一个函数调用.

你可以查看这个函数的参数传入等问题,,是否参数为空,或者数组索引超出,等等..
或者还要向上几句找找错误的来源..

总之: 堆栈里第一处自己填写代码的地方,是错误直接由自己的代码引起的地方..
真正的错误原因就在这附近.

jamesony 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 marrco2005 的回复:]
重新改了一下
[/Quote]
marroc2005,非常感谢您的帮忙。我想问下您是如何定位到出错的地方的呢?谢谢
jamesony 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhucde 的回复:]
哥们, 下载一下还要扣资源分啊?


[/Quote]
不好意思啊 上传的时候没注意。。。实在对不起
ripyu 2010-01-14
  • 打赏
  • 举报
回复
08已经很严谨了
rainfull 2010-01-14
  • 打赏
  • 举报
回复
2008要求很严格,不像vc6那样约束不严。
marrco2005 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luhongyu2108 的回复:]
学习了,但是请问楼上的高手,为什么在VC6里能用,到了VS2008就不能用了呢??

[/Quote]
能用不代表没有错误,一个软件表面上看起来运行正常,内部仍然可能存在问题
我曾经遇到过一个软件,我添加了代码之后,程序一运行就崩溃,但是我添加的部分绝对没有问题
后来检查才发现,这个程序以前的代码有内存越界的问题,而我添加的代码就成了让程序崩溃的那一根稻草

luhongyu2108 2010-01-14
  • 打赏
  • 举报
回复
学习了,但是请问楼上的高手,为什么在VC6里能用,到了VS2008就不能用了呢??
marrco2005 2010-01-14
  • 打赏
  • 举报
回复
重新改了一下
把 CString pszText 替换掉

void CProtocolAnalysisSystemDlg::ShowTabWindow(CTabCtrl &m_tab)
{
int pos=0;
pos=m_tab.GetCurSel();
TCITEM TabCtrlItem;
char buffer[1024];
TabCtrlItem.mask=TCIF_TEXT|TCIF_PARAM;
TabCtrlItem.pszText=buffer;
TabCtrlItem.cchTextMax=1024;

for (int i=0; i<m_tab.GetItemCount(); i++)
{
ZeroMemory( buffer, sizeof(buffer));
m_tab.GetItem(i,&TabCtrlItem);
if (i!=pos)
{
GetDlgItem(TabCtrlItem.lParam)->ShowWindow(SW_HIDE);
}
else
{
GetDlgItem(TabCtrlItem.lParam)->ShowWindow(SW_SHOW);
CString stateText=_T("当前状态: ");
CListCtrl* pList;
int packetNum=0;
CString packetInf=_T("数据包数目: ");
CString packetTmp=_T("");
stateText+=TabCtrlItem.pszText;
m_statusBar.SetText(stateText, 0, 0);
pList=(CListCtrl*)(GetDlgItem(TabCtrlItem.lParam));
packetNum=pList->GetItemCount();
packetTmp.Format("%d", packetNum);
packetInf+=packetTmp;
m_statusBar.SetText(packetInf, 1, 0);

}

}
AssignItem();

}
marrco2005 2010-01-14
  • 打赏
  • 举报
回复
帮你调试了一下


void CProtocolAnalysisSystemDlg::ShowTabWindow(CTabCtrl &m_tab)
{
int pos=0;
pos=m_tab.GetCurSel();
TCITEM TabCtrlItem;

// CString pszText=_T(""); // 原来的代码 pszText 分配的地址空间不够,后面写越界了
CString pszText=_T("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

TabCtrlItem.mask=TCIF_TEXT|TCIF_PARAM;
TabCtrlItem.pszText=(LPTSTR)(LPCSTR)pszText;
TabCtrlItem.cchTextMax=1024;

for (int i=0; i<m_tab.GetItemCount(); i++)
{
m_tab.GetItem(i,&TabCtrlItem);
if (i!=pos)
{
GetDlgItem(TabCtrlItem.lParam)->ShowWindow(SW_HIDE);
}
else
{
GetDlgItem(TabCtrlItem.lParam)->ShowWindow(SW_SHOW);
CString stateText=_T("当前状态: ");
CListCtrl* pList;
int packetNum=0;
CString packetInf=_T("数据包数目: ");
CString packetTmp=_T("");
stateText+=TabCtrlItem.pszText;
m_statusBar.SetText(stateText, 0, 0);
pList=(CListCtrl*)(GetDlgItem(TabCtrlItem.lParam));
packetNum=pList->GetItemCount();
packetTmp.Format("%d", packetNum);
packetInf+=packetTmp;
m_statusBar.SetText(packetInf, 1, 0);

}

}
AssignItem();

}

15,979

社区成员

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

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