内存泄漏,高手请进,来者有分!

ISAKEEPER 2003-08-29 07:59:39
一个通信代码,运行在单用户下,内存保持不变,一旦有两个用户连接,就出现每次增加4K,逐步增加,直到内存耗完。我是定时发送数据,
用BoundsChecker检测到以下错误提示:
Thread 0 (thread id:284 (0x11C))
Invalid argument GlobalGetAtomNameA, argument 1, GLOBALATOM: 0x0000C026
...全文
73 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_pin 2003-09-07
  • 打赏
  • 举报
回复
关注
horin153 2003-08-31
  • 打赏
  • 举报
回复
看了你的代码,感觉你并不是有一个用户连接就增加一个工作线程,而是所有用户连接链表共享一个发送线程(工作线程).因而不存在因为新增线程导致内存泄漏的原因.如一个用户可正常工作,而两个用户就内存泄漏,而这时的变化仅是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);
......
ISAKEEPER 2003-08-30
  • 打赏
  • 举报
回复
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个用户后,就没有添加、删除用户,因此用户链表的操作几乎没有,但内存还是在不断的增长
harrypotter 2003-08-29
  • 打赏
  • 举报
回复
CServiceSocket *pSocket = new CServiceSocket(this);
你在哪儿delete??
ISAKEEPER 2003-08-29
  • 打赏
  • 举报
回复
感谢yushulei(永远)!
yushulei 2003-08-29
  • 打赏
  • 举报
回复
哎,我不懂通信,只能精神上鼓励楼主了!
ISAKEEPER 2003-08-29
  • 打赏
  • 举报
回复
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这两个链表中无指针

horin153 2003-08-29
  • 打赏
  • 举报
回复
是不是有两个用户链接时,频繁重复产生新进程/线程?
没代码,也不知是否mem leak

16,466

社区成员

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

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

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