这是一个windows ce 上的TCP服务端程序  
程序的主对话框类为CTCPServerDlg,
自定义了2个类CTCPServer_CE 和CTCPCustom_CE 通过封装socket API函数,CTCPServer_CE 类实现监听功能,CTCPCustom_CE 实现通讯功能。
CTCPServerDlg有个CTCPServer_CE类型的私有成员m_tcpServer,
程序通过对话框上的监听按钮的消息响应函数void CTCPServerDlg::OnBtnlisten() 中的语句m_tcpServer.Open()打开socket;
open()函数中m_serverThreadHandle = CreateThread(NULL,0,SocketThreadFunc,this,0,NULL);创建通讯线程,SocketThreadFunc函数定义如下:
/*--------------------------------------------------------------------
【函数介绍】:  此线程用于检测监听套接字事件。
【入口参数】:  lparam:无类型指针,可以通过此参数,向线程中传入需要用到的资源。
   在这里我们将CTCPServer_CE类实例指针传进来
【出口参数】:  (无)
【返回  值】:  返回值没有特别的意义,在此我们将返回值设为0。
---------------------------------------------------------------------*/
DWORD CTCPServer_CE::SocketThreadFunc(PVOID lparam)
{
CTCPServer_CE *pSocket;
//得到CTCPServer_CE实例指针
pSocket = (CTCPServer_CE*)lparam;
//定义读事件集合
fd_set fdRead;
int ret;
TIMEVAL aTime;
aTime.tv_sec = 1;
aTime.tv_usec = 1;
while (TRUE)
{
        //收到退出事件,结束线程
if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0)
{
break;
}

FD_ZERO(&fdRead);
FD_SET(pSocket->m_ServerSocket,&fdRead);

ret = select(0,&fdRead,NULL,NULL,&aTime);

if (ret == SOCKET_ERROR)
{
//触发错误事件
int iErrorCode = WSAGetLastError();
//触发服务器socket的错误事件
pSocket->OnServerError(pSocket->m_pOwnerWnd,pSocket,iErrorCode);
//关闭服务器套接字 
closesocket(pSocket->m_ServerSocket);
break;
}

if (ret > 0)
{
//判断是否读事件
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);
}
else
{
delete pClientSocket;
}
}
}
}
return 0;
}当有客户端发来连接请求后,并没有发生各种异常情况时,该线程通过CTCPCustom_CE * pClientSocket = new CTCPCustom_CE();申请一个动态的CTCPCustom_CE
对象指针, 在通过pClientSocket->Open(pSocket)调用 CTCPCustom_CE对象的Open()函数,该函数通过语句
   m_tcpThreadHandle = CreateThread(NULL,0,SocketThreadFunc,this,0,NULL) 创建通讯线程 SocketThreadFunc定义如下:
/*--------------------------------------------------------------------
【函数介绍】:  此线程用于监听与客户端连接的socket通讯的事件,例如当接收到数据、
   连接断开和通讯过程发生错误等事件
【入口参数】:  lparam:无类型指针,可以通过此参数,向线程中传入需要用到的资源。
   在这里我们将CTCPCustom_CE类实例指针传进来
【出口参数】:  (无)
【返回  值】:  返回值没有特别的意义,在此我们将返回值设为0。
---------------------------------------------------------------------*/
DWORD CTCPCustom_CE::SocketThreadFunc(PVOID lparam)
{
CTCPCustom_CE *pSocket;
//得到CTCPCustom类实例指针
pSocket = (CTCPCustom_CE*)lparam;
//定义读事件集合
fd_set fdRead;  
int ret;
TIMEVAL aTime;
aTime.tv_sec = 1;
aTime.tv_usec = 0;
while (TRUE)
{
        //收到退出事件,结束线程
if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0)
{
break;
}
//置空读事件集合
FD_ZERO(&fdRead);
//给pSocket设置读事件
FD_SET(pSocket->m_socket,&fdRead);
//调用select函数,判断是否有读事件发生
ret = select(0,&fdRead,NULL,NULL,&aTime);

if (ret == SOCKET_ERROR)
{
//触发错误事件
pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,1);
//关闭socket
closesocket(pSocket->m_socket);
break;
}

if (ret > 0)
{
//判断是否读事件
if (FD_ISSET(pSocket->m_socket,&fdRead))
{
char recvBuf[1024];
int recvLen;
ZeroMemory(recvBuf,1024);
recvLen = recv(pSocket->m_socket,recvBuf, 1024,0); 
if (recvLen == SOCKET_ERROR)
{
int nErrorCode = WSAGetLastError();
//触发与客户端端连接的Socket错误
pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,nErrorCode);
//触发与客户端端连接的Socket关闭事件
pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket);
//关闭socket
closesocket(pSocket->m_socket);
break; }
//表示连接已经从容关闭
else if (recvLen == 0)
{
pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket);
//关闭socket
closesocket(pSocket->m_socket);
break;
}
else
{
   //触发与客户端端连接的Socket读事件
                   pSocket->m_pTCPServer_CE->OnClientRead(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,recvBuf,recvLen);
}
}
}
}
return 0;
}
好了 我不理解的地方出现了:
监听线程在收到一个客户端的连接请求后,当没有发生异常情况和关闭命令时会通过执行语句CTCPCustom_CE * pClientSocket = new CTCPCustom_CE() 动态申请CTCPCustom_CE()对象,然后通过pClientSocket->Open(pSocket)创建通讯线程,由于没有发生异常情况和关闭命令所以主线程不会退出继续运行;你发现没有,在主线程和子线程中都没有执行语句 delete pClientSocket,所以在主线程接受下一个客户端的连接请求时,它又执行了CTCPCustom_CE * pClientSocket = new CTCPCustom_CE() 语句,但这时的pClientSocket并没有delete啊,这样可以吗?这个程序是本资料上的程序案例,程序编译没错,但这个地方我不明白,望高手指点迷津!!