在一个定时器当中用了CSocket,多次运行发现在任务管理器当中本进程进程当中占用的内存以4k的速度不断增加,并且不能降下来,机器开了一晚上增加到了40多m
代码为
void CMyDlg::OnTimer(UINT nIDEvent) 
{
  CSocket socket1;

  if (m_ihost>3)
  {
  m_ihost=0;
  }
  socket.Create();   
m_bhost[m_ihost]=socket1.Connect("10.10.10.120",139);
  m_ihost++;
  socket1.Close();
CDialog::OnTimer(nIDEvent);
}
将CSocket 定义到计时器外面也一样,
当把Create运行到计时器外面时不出现内存增加的问题,但是不能得到正确的结果,只有第一次的结果是TRUE,以后都是FALSE,
希望高手没给个提示

解决方案 »

  1.   

    这个我也发现这样的问题,但是同样有发现另一个问题,如果你给Dlg加上上另一个成员m_sock,然后再在OnInitDialog里面Create(),不要关闭,那么内存就不会增加了,真是太奇怪了
      

  2.   

    调用 CSocket::Create 函数后,socket 被创建。 socket 创建过程中调用 CAsyncSocket::AttachHandle(SOCKET hSocket, CAsyncSocket* pSocket, BOOL bDead) 。该函数的作用是: 将 socket 实例句柄和 socket 指针添加至 当前模块状态 ( 注 1 )的一个映射表变量 m_pmapSocketHandle 中。 
    在 AttachHandle 过程中,会 new 一个 CSocketWnd 实例 ( 基于 CWnd 派生 ) ,这里将这个实例称之为 socket window ,进一步理解为它是存放所有 sockets 的消息池 ( window 消息),请仔细查看,这里 socket 后多加了一个 s ,表示创建的多个 socket 将共享一个 消息池 。 是不是attach与detach的操作引起的,这种对象不要频繁的去create...
      

  3.   

    是所有socket的吗? 如果真是这样,那么我对一个CSocket对象调用了WSAAsyncSelect()函数以后,其他的CSocket对象的OnReceive等函数就得不到响应了。  我还有个问题请教一下,就是两个CSocket对象,sock1, sock2,sock1创建了以后,我用sock2.Attach(sock1.m_hSocket),来附加在同一个套接字上,然后连接到服务器,完成后sock2.Detach()。可是这个时候,sock1的OnReceive函数就不响应,被阻塞了。
      

  4.   

    我遇到过类似的问题,内存一小点一小点不断的增加,起初怀疑是MS的CSocket有问题,经过一翻折腾后没搞定,把所有的代码换成socket重新写(没用CSocket),结果问题解决。到现在我还是认为是CSocket有问题。
      

  5.   

    socket1没有创建就连接?
    socket.Create();  有问题的,同一个socket怎么能多次create?