做了一个通信方面的程序,是点对多型服务器端和客户端,发现启动定时器后(定时调用发送函数),,当有几个用户连接服务器后,内存按4k一次的方式增长,但运行一段时间后,其占有的内存有时又有所减少,不过最后还是会出现虚拟内存占用完的错误,(启动时只有4,210K,运行1个小时后,将达到33,000K),请高手指点,谢谢!struct Protocol{ //自定义协议结构
char ptime[30]; //上次发送时间
DWORD Sqnum; //流水号
DWORD Checknum;
struct DATA Data;//DATA结构中也没有NEW生成的对象,都是定长的数据类型
Protocol()
{
......
}
};
CList <Protocol,Protocol&> m_dataList;//待发送数据队列
然后在利用定时器定时调用发送函数Send_List()void CCommunictionDlg::Send_List(DATA & data, DWORD n)
{
Protocol protocol_send;
.....
m_dataList.AddTail(protocol_send);
.....
::AfxBeginThread(_SendMsgThread,this);
}
void CCommunictionDlg::ProcessRecieveMessage(CServiceSocket *pSocket) //接受函数
{ .....
if(.....)
m_dataBackupList.RemoveHead();//这里是否还没释放资源呀??????
....
}做了这个试验:
在RemoveAt()语句前后,分别求链表的元素个数,发现个数是有减小
char ptime[30]; //上次发送时间
DWORD Sqnum; //流水号
DWORD Checknum;
struct DATA Data;//DATA结构中也没有NEW生成的对象,都是定长的数据类型
Protocol()
{
......
}
};
CList <Protocol,Protocol&> m_dataList;//待发送数据队列
然后在利用定时器定时调用发送函数Send_List()void CCommunictionDlg::Send_List(DATA & data, DWORD n)
{
Protocol protocol_send;
.....
m_dataList.AddTail(protocol_send);
.....
::AfxBeginThread(_SendMsgThread,this);
}
void CCommunictionDlg::ProcessRecieveMessage(CServiceSocket *pSocket) //接受函数
{ .....
if(.....)
m_dataBackupList.RemoveHead();//这里是否还没释放资源呀??????
....
}做了这个试验:
在RemoveAt()语句前后,分别求链表的元素个数,发现个数是有减小
2.可以使用BoundChecker.VisualC++这个工具检查内存泄漏。
3.RemoveAt(),RemoveHead(),RemoveAll(),都是移出链表的元素,并不释放元素占用
的内存。
4.在类的析构函数中调用Remove...()系列函数,这样先释放元素内存,后删处链表元素。
菜鸟初次用多线程,请我怎样才能释放AfxBeginThread();资源呀
并且关闭CreateThread得到的句柄。
那我在控制函数中已经
return 0 ;
{
Protocol protocol_send;
.....
m_dataList.AddTail(protocol_send);
.....
::AfxBeginThread(_SendMsgThread,this);
}你每次发送数据都会起一个线程,没有必要也不应该。
你只需要启动一个线程专门用作发送数据线程。
“::AfxBeginThread(_SendMsgThread,this);打开n个线程引起”,对这句我有点不理解,每次发送一个数据时调用一次发送线程,但是发送完之后,在线程控制函数中,return 0;这样释放了资源了,那又怎会打开n个线程啊?
用了BoundsChecker检测了代码,发现线程函数有问题,提示如下:
代码共有2个线程
thread 0(thread id:940(ox3ac))
thread 1(thread id:1104(ox450))
Invalid argument:CObject ::operator delete HANDLE:0x02002950:Bad handlethread 0 shi 指主线程吗?这些错误可能的原因,谢谢