socket多线程编程,内存泄露怎么解决?

hanbing227 2013-06-13 10:41:22
网上下的一个socket多线程通信,有服务端和客户端
但调试代码很多内存泄露的地方,有很多new的地方,贴出代码,请教大家怎么解决! 谢谢


void CNetworkComDlg::OnStart()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(!AfxSocketInit(NULL))//初始化套接字
{
AfxMessageBox("CSocket初始化失败!");
return;
}
if(serverSocket!=NULL)
{
serverSocket->Close();//关闭套接字
delete serverSocket;
}
serverSocket=new CSocket;
if(!serverSocket->Create(m_Port))//创建套接字,会自动绑定
{
AfxMessageBox("套接字创建失败!");
return;
}
if(!serverSocket->Listen(5))//开始侦听
{
AfxMessageBox("套接字侦听失败!");
return;
}
CButton *pButton=(CButton *)GetDlgItem(IDC_START);
pButton->EnableWindow(false);

SOCKET hSOCKET=serverSocket->Detach();//从CSocket中分离出SOCKET

RECVPARAM *pRecvData=new RECVPARAM;
pRecvData->serverSocket=serverSocket;
pRecvData->currentSocket=NULL;
pRecvData->hwnd=m_hWnd;//当前窗口的句柄
pRecvData->pSOCKET=hSOCKET;

AfxBeginThread(ThreadProc,pRecvData);//启动新的线程来负责侦听
}


UINT CNetworkComDlg::ThreadProc(LPVOID lparam)//开始服务器的监听
{
try
{
RECVPARAM *pRecvData=(RECVPARAM *)lparam;
CSocket *server=pRecvData->serverSocket;

SOCKET sock=pRecvData->pSOCKET;
server->Attach(sock);//将CSocket与SOCKET绑定

while(true)
{
CSocket *clientSocket=new CSocket;
server->Accept(*clientSocket);//获得客户端的连接

//接收客户端的连接之后启动新的线程来处理与客户端的交互
pRecvData->currentSocket=clientSocket;

SOCKET hSOCKET=clientSocket->Detach();//从CSocket中分离出SOCKET
pRecvData->pSOCKET=hSOCKET;

AfxBeginThread(SendRecvProc,pRecvData);//启动新的线程来处理与客户端的交互
delete clientSocket;
}

}
catch(int ex)
{
return 0;
}
return 0;
}


提示内存泄露的地方在上面的
CSocket *server=pRecvData->serverSocket; 和RECVPARAM *pRecvData=new RECVPARAM;处。

内存泄露提示:
Dumping objects ->
c:\documents and settings\administrator\桌面\csockt多线程networkcom +++\networkcom\networkcomdlg.cpp(228) : {122} client block at 0x00393668, subtype c0, 20 bytes long.
a CSocket object at $00393668, 20 bytes long
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {113} client block at 0x00393550, subtype c0, 68 bytes long.
a CWinThread object at $00393550, 68 bytes long
c:\documents and settings\administrator\桌面\csockt多线程networkcom +++\networkcom\networkcomdlg.cpp(208) : {112} normal block at 0x00393500, 20 bytes long.
Data: < BB 09 > 84 42 42 00 00 00 00 00 B0 30 39 00 E8 15 00 00
c:\documents and settings\administrator\桌面\csockt多线程networkcom +++\networkcom\networkcomdlg.cpp(192) : {107} client block at 0x003930B0, subtype c0, 20 bytes long.
a CSocket object at $003930B0, 20 bytes long
Object dump complete.
...全文
272 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_wei 2013-06-14
  • 打赏
  • 举报
回复
RECVPARAM *pRecvData; 不用new也可以
ouyh12345 2013-06-14
  • 打赏
  • 举报
回复
直接在线程里使用socket

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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