一个通信代码,运行在单用户下,内存保持不变,一旦有两个用户连接,就出现每次增加4K,逐步增加,直到内存耗完。我是定时发送数据,
用BoundsChecker检测到以下错误提示:
Thread 0 (thread id:284 (0x11C))
Invalid argument GlobalGetAtomNameA, argument 1, GLOBALATOM: 0x0000C026
用BoundsChecker检测到以下错误提示:
Thread 0 (thread id:284 (0x11C))
Invalid argument GlobalGetAtomNameA, argument 1, GLOBALATOM: 0x0000C026
没代码,也不知是否mem leak
我的代码有两个线程,一个发送线程,一个主线程;现在是定时发送数据,调用发送线程,发完后,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这两个链表中无指针
你在哪儿delete??
{
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个用户后,就没有添加、删除用户,因此用户链表的操作几乎没有,但内存还是在不断的增长
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);
......