莫明奇妙的泄露

zjz800800 2006-06-14 03:45:46
作了一个基于对话框的网络通讯程序程序一开始在Dlg::OnInitDialog()中配置都好着然后调用
BOOL Dlg::OnInitDialog()
{
...
sock=socket(AF_INET,SOCK_STREAM,0);
...
AfxBeginThread(&thread,0);
}
现成代码为
UINT thread(LPVOID p)
{
...
rsvsock=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));

if (dlg->rsvsock==INVALID_SOCKET)
{
//服务器已经关闭
AfxEndThread(0);
}
}

问题来了如果我单领做个按钮里面事件写着
void CCServerDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CCServerDlg* dlg = (CCServerDlg*)AfxGetApp()->GetMainWnd();
closesocket(dlg->rsvsock);
closesocket(dlg->sock);
}
然后点点击OnCancel就会关闭无泄露
但是直接写在这个函数里面
void CCServerDlg::OnCancel()
{
// TODO: 在此添加控件通知处理程序代码
CCServerDlg* dlg = (CCServerDlg*)AfxGetApp()->GetMainWnd();
closesocket(dlg->rsvsock);
closesocket(dlg->sock);
}
就有泄露提示如下:
Detected memory leaks!
Dumping objects ->
thrdcore.cpp(311) : {79} client block at 0x00BA52C8, subtype c0, 64 bytes long.
a CWinThread object at $00BA52C8, 64 bytes long
Object dump complete.

请高手解释一下
...全文
279 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjz800800 2006-06-15
  • 打赏
  • 举报
回复
rsvsock=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));
这里,在等待客户机
seasol 2006-06-15
  • 打赏
  • 举报
回复
子线程不能结束,那你看子线程是阻塞到哪个地方了。
zjz800800 2006-06-15
  • 打赏
  • 举报
回复

不是的
我现在是这样作的1.首先在初始化的死后创建个事件量m_Exit
2.在子线程结束的时候用SetEvent(dlg->m_Exit);
3.在OnCancel里面结束WaitForSingleObject(m_Exit,INFINITE)
问题出来了,程序一直在WaitForSingleObject(m_Exit,INFINITE)阻塞,
等不到子线程结束,现在我又不能在子线程里面设置信号量,那样的话会
造成多个客户机只能连接一个就阻塞,还有WaitForSingleObject等不来信
号是因为一直执行不了SetEvent(dlg->m_Exit);也就是说当我点击主线程的OnCancel的
时候子线程一直结束不了,头大了
seasol 2006-06-14
  • 打赏
  • 举报
回复
估计你是听楼上的把AfxEndThread(0)改为return 0了。
建议你再改回来。
zjz800800 2006-06-14
  • 打赏
  • 举报
回复
可以等到但还是有泄露,我看了一下泄露的句柄就是线程没关闭
seasol 2006-06-14
  • 打赏
  • 举报
回复
你在子线程中加个断点,看是否子线程退出了。
子线程不退出,WaitForSingleObject 将会一直等待
zjz800800 2006-06-14
  • 打赏
  • 举报
回复
对,就是线程没有返回就强行退出了,原因就在这里,但是我现在用seasol(海子) 的方法,程序一直阻赛在WaitForSingleObject (hThread,INFINITE);出不来
gao_ming77 2006-06-14
  • 打赏
  • 举报
回复
同意seasol(海子),
感觉你在退出进程的时候,线程其实是正在被accept函数block了,所以你看输出有个
“client block at 0x00BA52C8”。所以,应该试试seasol(海子)的方法。
theone 2006-06-14
  • 打赏
  • 举报
回复
用return 0来返回,不要调用AfxEndThread
seasol 2006-06-14
  • 打赏
  • 举报
回复
因为在OnCancel中执行完代码后,整个程序就退出了。
使得子线程没有机会退出。所以你需要在执行完closesocket(dlg->rsvsock);closesocket(dlg->sock);之后,
等待,直到子线程退出。
1、在OnInitDialog中记录线程句柄
CWinThread* pThread=AfxBeginThread(&thread,0);
HANDLE hThread=pThread->m_hThread;
2、在closesocket之后,加上
WaitForSingleObject (hThread,INFINITE);
zjz800800 2006-06-14
  • 打赏
  • 举报
回复
AfxEndThread(0);
这样关闭的
theone 2006-06-14
  • 打赏
  • 举报
回复
你的thread是怎么关闭的?
zjz800800 2006-06-14
  • 打赏
  • 举报
回复
难道真的只能手动关闭一下,不会吧,神阿,救救我吧
zjz800800 2006-06-14
  • 打赏
  • 举报
回复
不行,还是有泄露,晕的很
zjz800800 2006-06-14
  • 打赏
  • 举报
回复
好的我试一下
gao_ming77 2006-06-14
  • 打赏
  • 举报
回复
不要调AfxEndThread,直接return 0;

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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