一个通信代码,运行在单用户下,内存保持不变,一旦有两个用户连接,就出现每次增加4K,逐步增加,直到内存耗完。我是定时发送数据,
用BoundsChecker检测到以下错误提示:
Thread 0 (thread id:284 (0x11C))
Invalid argument GlobalGetAtomNameA, argument 1, GLOBALATOM: 0x0000C026

解决方案 »

  1.   

    是不是有两个用户链接时,频繁重复产生新进程/线程?
    没代码,也不知是否mem leak
      

  2.   

    to horin153(horin):你好!
    我的代码有两个线程,一个发送线程,一个主线程;现在是定时发送数据,调用发送线程,发完后,return 0;
    UINT _SendMsgThread(LPVOID pParam) //TCP发送信息线程函数
    {
    CCommunictionDlg *pDlg=(CCommunictionDlg *)pParam;
    if(pDlg->StopServer == true) return -1;
       s_cs.Lock();
    for(POSITION position = m_dataList.GetHeadPosition(); NULL !=position; m_dataList.GetNext(position))
     {
        Protocol  protocol_Send = m_dataList.GetAt(position);
            s_cs_client.Lock();
        POSITION pos = m_connectionList.GetHeadPosition();   
    while(pos != NULL)
    {    
    CONN conn = m_connectionList.GetAt(pos);
    char Buffer[MAX] = {0};
                                 ....
      memcpy(Buffer+2,&protocol_Send,sizeof(Protocol));
    int nSended = conn.pSock->Send(Buffer,MAX);
    memset(Buffer,'0',MAX);

                                Protocol protocol_rep = protocol_Send;
    m_dataBackupList.AddTail(protocol_rep);
    m_connectionList.GetNext(pos);
    }
    s_cs_client.Unlock();
       }
        s_cs.Unlock();
    return 0;
    }
    void CCommunictionDlg::ProcessAccept(CAcceptSocket*m_pSocket)//增加连接队列元素
    {
        CServiceSocket *pSocket = new CServiceSocket(this);
    if (m_pSocket->Accept(*pSocket))
             {
                   conn.pSock = pSocket;
                  m_connectionList.AddTail(conn);
              }
    }
    void CCommunictionDlg::Send_List(DATA & data, DWORD n)
    { .....
     AfxBeginThread(_SendMsgThread,this);
    ...
    }
    CList <CONN,CONN&> m_connectionList; 
    struct CONN{            //连接结构
        char SourceIP[16];     //存放客户端的IP地址
       int nSock;             //client port
       CServiceSocket *pSock;   //client Object
    };m_dataBackupList;m_dataList这两个链表中无指针
      

  3.   

    CServiceSocket *pSocket = new CServiceSocket(this);
    你在哪儿delete??
      

  4.   

    else if ( spanElapsed.GetTotalSeconds() >7 && spanElapsed.GetTotalSeconds() <20)
      {
        s_cs_client.Lock();
        
        for(POSITION pos = m_connectionList.GetTailPosition(); NULL != pos; m_connectionList.GetPrev(pos))
    {
      CONN conn = m_connectionList.GetAt(pos);
      if(conn.pSock->m_bChecked != true) 
      {
     delete conn.pSock;
     m_connectionList.RemoveAt(pos);
     continue;
      }
    }

        s_cs_client.Unlock();
      }
    还有在程序退出函数中也有
     delete conn.pSock;
    m_connectionList.RemoveAt(pos);我感觉不是这里的问题,因为测试时,连接2个用户后,就没有添加、删除用户,因此用户链表的操作几乎没有,但内存还是在不断的增长
      

  5.   

    看了你的代码,感觉你并不是有一个用户连接就增加一个工作线程,而是所有用户连接链表共享一个发送线程(工作线程).因而不存在因为新增线程导致内存泄漏的原因.如一个用户可正常工作,而两个用户就内存泄漏,而这时的变化仅是m_connectionList有1变2.而发送线程中又要根据m_connectionList循环发送数据.所有我觉得最大可疑之处是:
    POSITION pos = m_connectionList.GetHeadPosition();   
    while(pos != NULL)
    {    
    CONN conn = m_connectionList.GetAt(pos);
    char Buffer[MAX] = {0};
                                 ....
      memcpy(Buffer+2,&protocol_Send,sizeof(Protocol));
    int nSended = conn.pSock->Send(Buffer,MAX);
    memset(Buffer,'0',MAX);

                                Protocol protocol_rep = protocol_Send;
    m_dataBackupList.AddTail(protocol_rep);
    m_connectionList.GetNext(pos);
    }
    但看你的代码循环条件又没有问题.惭愧,我是没辙了:)
    顺便提一句,我常用的链表循环是:
    POSITION pos = m_connectionList.GetHeadPosition();   
    while(pos != NULL)
    {    
    CONN conn = m_connectionList.GetNext(pos);
                               ......