程序占用内存的增大是有规律的 ,基本上每次增加4k
程序短时间运行是没有任何问题的 ,但,如果长时间运行,比如24小时,就会增加大约20兆左右的内存,这样下去,程序迟早会崩溃的,
请问,这个是什么原因呢 ?
      我的程序里没有用到动态分配内存,都是事先分配好的.并且,可以肯定占用内存增大就是由这个函数引起的.

解决方案 »

  1.   

    你为什么要不断的调用GetInPut()函数?
      

  2.   

    我以前也用过那个该死的控件,后来我发现这篇文章,不是这写的啊,
    ///////////////////////////////////////////////////////////////////
    一般编写串口控件接收数据时,是这样写的://初始化设置m_msComm.SetCommPort(1)//打开COM1
    m_msComm.SetPortOpen(true);//打开串口
    m_msComm.SetSettings("115200,n,8,1");//串口参数设置  
    m_msComm.SetInputMode(1);//comInputModeBinary设置Binary缓冲区输入方式
    m_msComm.SetRThreshold(5);//每接收5个字符则激发OnComm()事件
    m_msComm.SetInputLen(5);//每次读取5个字符//接收数据void CCOMDlg::OnComm() 
    {
     VARIANT variant_inp;
     COleSafeArray safearray_inp;
     LONG len,k;
     BYTE rxdata[5]; //设置BYTE数组
     CString strtemp; switch(m_msComm.GetCommEvent())
     {
     case 2://事件值为2表示接收缓冲区内有字符
      variant_inp=m_msComm.GetInput(); //读缓冲区--------------------------------*
      safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
      len=safearray_inp.GetOneDimSize(); //验证得到有效数据长度
      assert(len == 5);
      for(k=0;k<len;k++)//len is 5 in normal case
       safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
      
      HandleCommand(rxdata);//这是接收数据处理函数
      break; default:
      break;
     }
    }//发送void CCOMDlg::SendCommand(unsigned char commandID,int para1,int para2)
    {
     BYTE strBuf[5],tempbyte; 
     CByteArray OutBuf; 
     COleVariant varOutput;  //命令字
     strBuf[0] = commandID;
     
     //地址高位
     tempbyte = (para1>>8) & 0xff;
     strBuf[1] = tempbyte; //地址低位
     tempbyte = para1 & 0xff;
     strBuf[2] = tempbyte; //数据高位
     tempbyte = (para2>>8) & 0xff;
     strBuf[3] = tempbyte; //数据低位
     tempbyte = para2 & 0xff;
     strBuf[4] = tempbyte; OutBuf.SetSize(5); 
     for(int i=0;i<5;i++) 
      OutBuf[i] = strBuf[i]; 
     varOutput = OutBuf; 
     m_msComm.SetOutput(varOutput); 
    }问题出在VARIANT型变量上,当执行到*号的这一行时,VARIANT型变量就会使内存增加,可以用下面的方法解决:void CCOMDlg::OnComm() 
    {
     
     long len,k;
     COleVariant myVar;
     COleSafeArray safearray_inp;
     BYTE rxdata[5]; //设置BYTE数组 switch(m_msComm.GetCommEvent())
     {
     case 2://事件值为2表示接收缓冲区内有字符  myVar.Attach (m_msComm.GetInput());--------------------------------------*  safearray_inp = myVar;  //COleVariant型变量转换为ColeSafeArray型变量  len=safearray_inp.GetOneDimSize(); //验证得到有效数据长度
      assert(len == 5);  for(k=0;k<len;k++)   //len is 5 in normal case
       safearray_inp.GetElement(&k,rxdata+k);   //转换为BYTE型数组
      
      HandleCommand(rxdata); );//这是接收数据处理函数  break;
      

  3.   

    从未用过此控件,都是用API。