做了一个通信方面的程序,是点对多型服务器端和客户端,发现启动定时器后(定时调用发送函数),,当有几个用户连接服务器后,内存按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()语句前后,分别求链表的元素个数,发现个数是有减小

解决方案 »

  1.   

    试试m_dataBackupList.RemoveAll();如果还不行:1.在debug环境下运行,退出后可以看到是否有内存泄漏。
    2.可以使用BoundChecker.VisualC++这个工具检查内存泄漏。
    3.RemoveAt(),RemoveHead(),RemoveAll(),都是移出链表的元素,并不释放元素占用
    的内存。
    4.在类的析构函数中调用Remove...()系列函数,这样先释放元素内存,后删处链表元素。
      

  2.   

    如果要删除元素的占有的内存,应该怎样删除该元素的内存呢?(我的元素中好像没有用new对象)
      

  3.   

    RemoveAt()、RemoveAll()...都是清空数组,和内存泄漏没关(如果你new指针)。::AfxBeginThread();是要创建新线程的,你有没有释放他们?
      

  4.   

    RemoveAt()、RemoveAll()...都是清空数组,和内存泄漏没关(如果没有你new指针)。::AfxBeginThread();是要创建新线程的,你有没有释放他们?
      

  5.   

    to SnowWolfSLF(雪狼):你好!
    菜鸟初次用多线程,请我怎样才能释放AfxBeginThread();资源呀
      

  6.   

    在线程中某个适合的条件下Return或者ExitThread
    并且关闭CreateThread得到的句柄。
      

  7.   


    那我在控制函数中已经
    return 0 ;
      

  8.   

    void CCommunictionDlg::Send_List(DATA & data, DWORD n)
    {   
               Protocol protocol_send;
                .....
       m_dataList.AddTail(protocol_send);
      .....    
     ::AfxBeginThread(_SendMsgThread,this);
     }你每次发送数据都会起一个线程,没有必要也不应该。
    你只需要启动一个线程专门用作发送数据线程。
      

  9.   

    ::AfxBeginThread(_SendMsgThread,this);打开n个线程引起,同意joinrry(骑着小猪去流浪)的做法
      

  10.   

    TO yueming_99():你好!
    “::AfxBeginThread(_SendMsgThread,this);打开n个线程引起”,对这句我有点不理解,每次发送一个数据时调用一次发送线程,但是发送完之后,在线程控制函数中,return 0;这样释放了资源了,那又怎会打开n个线程啊?
      

  11.   

    TO ALL:
    用了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 指主线程吗?这些错误可能的原因,谢谢