hur.cn - 华软网

 热门搜索

vs2010对话框程序,关闭时出错

  作者:未知    来源:网络    更新时间:2011/8/10
我用vs2010编写一个对话框程序,程序在调试过程中运行良好,可是一关闭就出现以下的错误:
HeartRate_detect.exe 中的 0x5c78d7ff 处有未经处理的异常: 0xC0000005: 读取位置 0x5c78d7ff 时发生访问冲突

我在网上找了相关信息,0xC0000005异常是内存问题,但具体是什么问题呢?哪位大虾能告诉我啊
---华软 网友回答---
指针越界了吧,Debug下call stack看看函数调用堆栈~
---华软网友回复---
调试运行 出错后看看call stack
---华软网友回复---
调用堆栈看看最后你的程序执行到哪里,是否是跳进了IsWindow的断言里边,因为你是关闭后崩溃,怀疑是你自己在窗口类数据还没释放前DestroyWindow,就会产生读取数据冲突或者崩溃。
---华软网友回复---
指针或者数组越界 溢出 检查看看有没有哪儿重复析构啊 分配空间不够啊 尤其是分配空间 很容易在哪个地方少分配一些
---华软网友回复---
回复3楼:调用堆栈后我的程序停在了mfc100d.dll!CMapPtrToPtr::GetNextAssoc,箭头指向了if ((pAssocNext = pAssocRet->pNext) == NULL)这一句,请问这代表什么呢?
---华软网友回复---
我最近发现有可能是我的线程调用有问题,会不会是我在关闭对话框进程的时候我的线程还没有关闭的原因呢?因为我后来把这个辅助线程给关闭了(不用它了),再调试的时候关闭是正常的,请问下是不是线程还没有关闭的原因?又如何解决呢?
---华软网友回复---
我以前遇到过类似的问题,最后原因是析构函数没有写。。
这个应该不会是线程没有关闭的原因吧,只要线程里面不出什么问题,应该没事的。
坐等高手。。。
---华软网友回复---
引用 5 楼 atrezeguet 的回复:
回复3楼:调用堆栈后我的程序停在了mfc100d.dll!CMapPtrToPtr::GetNextAssoc,箭头指向了if ((pAssocNext = pAssocRet->pNext) == NULL)这一句,请问这代表什么呢?

这说明这个指针关联的数据已经为NULL了,引出崩溃。
---华软网友回复---
引用 6 楼 atrezeguet 的回复:
我最近发现有可能是我的线程调用有问题,会不会是我在关闭对话框进程的时候我的线程还没有关闭的原因呢?因为我后来把这个辅助线程给关闭了(不用它了),再调试的时候关闭是正常的,请问下是不是线程还没有关闭的原因?又如何解决呢?

你在关闭对话框的时候,假如你的辅助线程还没关闭,但是它们的数据已经没有数据关联的话,这时候是没问题的。但是假如是有关联的话,对话框一关闭,资源就释放了,那么辅助线程就里边关联的内存数据就没啦,就可能产生你那样的问题。当然,这个你要仔细查找清楚,很多东西懂得了原理,然后仔细查找,问题就可以解决的。
---华软网友回复---
以下是程序中辅助线程的代码,我的程序是通过SOCKET接收客户端发送来的12位数据包,在对话框中显示(画点)
UINT ThreadsProc(LPVOID pParam)
{
CHeartRate_detectDlg* dlg;   //CHeartRate_detectDlg新建的对话框类
dlg=(CHeartRate_detectDlg*)pParam;
int c;
int i=0;
void* p;
while(1)
{
if(dlg->isShow==TRUE) //进行读取
{
while(dlg->GetCnt<(dlg->AddCnt-1))
{
dlg->GetArray();
for(i=0;i<dlg->head->len;i++)
{
c=dlg->head->a[i];
Sleep(dlg->head->Interval);
dlg->m_OScopeCtrl.AppendPoint(c);
}
p=(void*)dlg->head->next;
free(dlg->head->a);
free(dlg->head);
dlg->head=(ArrayList*)p;
}
while(dlg->GetCnt==(dlg->AddCnt-1))      //直到GetCnt和AddCnt相等,就停止写入
{
dlg->GetArray();
for(i=0;i<dlg->head->len;i++)
{
c=dlg->head->a[i];
Sleep(dlg->head->Interval);
dlg->m_OScopeCtrl.AppendPoint(c);
}
if(dlg->AddCnt==dlg->GetCnt)
{
p=(void*)dlg->head->next;
free(dlg->head->a);
free(dlg->head);
dlg->head=NULL;
dlg->tail=NULL;
}
}
}
else
{
if(dlg->TimeLast>10000)    //实际上是等AddCnt的数量到达一定的值,在启用线程
{
// dlg->isShow=TRUE;
}
else
continue;
}
}
AfxMessageBox("quit");
return 0;
}

我发现一个奇怪的现象:当我把
                    if(dlg->TimeLast>10000)    //实际上是等AddCnt的数量到达一定的值,在启用线程
{
// dlg->isShow=TRUE;
}
中的dlg->isShow=TRUE;给注释掉时,就可以正常关闭了;但是有这一句时,就关闭异常。这是为什么呢?
是不是线程中给类成员变量赋值时出错?求高手解决
---华软网友回复---
求高手解决啊啊啊!!!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。