First-chance exception :0xC0000008:Invalid Handle

wjcapple 2010-01-06 04:30:31
有一个支持多Client.Socekt连接的 Server.Socket程序,每当有一个Client.Socket请求连接的时候,Server.Socket程序中会通过new出来一块区域存放Custom.Socket来建立和Client.Socket连接,new出来的Custom.Socket又存放到一个CList 里面。在Socket Server关闭的时候,要将CList中存放的Custom.Socket一个一个的取出来,调用Custom.Socket.closesocket(),然后,再将CList清空。程序运行没什么问题,调试环境下,调用Clist.RemoveHead()(我是从头开始移除的)时候出现:
First-chance exception in TCPServer.exe (NTDLL.DLL):0xC0000008:Invalid Handle。
进入到Clist.RemoveHead()内部,发现,RemoveHead()语句都可以执行,最后return 的时候出现上述错误,并且returnvalue的值也是正确的。代码如下:
CList<CTCPCustom_CE,CTCPCustom_CE&> m_ListClientSocket;
有连接请求:
if (FD_ISSET(pSocket->m_ServerSocket,&fdRead))
{
//如果调用了Listen,则表示触发了OnAccept事件
SOCKADDR_IN clientAddr;
CTCPCustom_CE * pClientSocket = new CTCPCustom_CE();
int namelen = sizeof(clientAddr);
//等待,创建与客户端连接的套接字
pClientSocket->m_socket = accept(pSocket->m_ServerSocket, (struct sockaddr *)&clientAddr, &namelen);
//接收到客户端连接
if (pClientSocket->m_socket)
{
pClientSocket->m_RemoteHost = inet_ntoa(clientAddr.sin_addr);
pClientSocket->m_RemotePort = ntohs(clientAddr.sin_port);

//触发与客户端建立连接事件
pSocket->OnClientConnect(pSocket->m_pOwnerWnd,pClientSocket);
//打开pClientSocket服务线程
pClientSocket->Open(pSocket);
//添加到客户端连接队列中
m_ListClientSocket.AddTail(*pClientSocket);
/*pClientSocketTemp=pClientSocket;*/
}
else
{
delete pClientSocket;

}
Server.Socket关闭的部分:
POSITION pos = m_ListClientSocket.GetHeadPosition();
while (pos != NULL)
{
CTCPCustom_CE &tmpTcpCustom = m_ListClientSocket.GetAt(pos);
if (!tmpTcpCustom.Close())
{
AfxMessageBox("关闭客户端socket错误");
}
m_ListClientSocket.RemoveHead();////这里调试的时候会出错,如前所述。
pos = m_ListClientSocket.GetHeadPosition();
}
问题:请大侠们分析出现在RemoveHead出现 First-chance exception in TCPServer.exe (NTDLL.DLL):0xC0000008:Invalid Handle
另外请问,那些new出来的,放在Clist中的Custom.Socket所占的内存会不会在RemoveHead的时候被一起释放掉?
...全文
1048 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
奉海 2010-01-13
  • 打赏
  • 举报
回复
提示很明白:Invalid Handle ,对象被delete了。
多线程中用list一般都要加锁的,否则一个地方删除,一个地方还在是使用,肯定会出现异常的。
你运行时没问题,remove时有问题,就是因为在你remove后,其他地方还在使用你remove掉的那个对象,
wjcapple 2010-01-13
  • 打赏
  • 举报
回复
咋就没人看到捏

18,356

社区成员

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

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