我有个串口采集的程序,程序大概是这样的BOOL CHTDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon m_com1.SetCommPort(1);
m_com1.SetSettings("9600,n,8,1");
 
m_com1.SetInputLen(0);
m_com1.SetInputMode(1);
m_com1.SetRThreshold(1);
m_com1.SetPortOpen(TRUE);
m_com1.GetInput();
m_com1.SetInBufferSize(2000);
m_com1.SetOutBufferSize(2000);         SetTimer(1,1000,NULL);
// TODO: Add extra initialization here

return TRUE;  // return TRUE  unless you set the focus to a control
}
void CHTDlg::send(int Num,CString Name)
{           sendData1  = "01 03 00 00 00 02 C4 0B"; 
if(m_com1.GetPortOpen())
{
if (!sendData1.IsEmpty())
{
CByteArray hexdata;
int len = String2Hex(sendData1, hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_com1.SetOutput(COleVariant(hexdata)); //发送十六进制数据
}
                           
else
{
::AfxMessageBox("没有可以发送的数据");
}
}
else 
{
::AfxMessageBox("请先打开串行口");
}
::Sleep(400);
         Name = "wen";
OnCommMscomm1(Name);  ///*******///
}
void CHTDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default

CDialog::OnTimer(nIDEvent); send(TH1,Name);
}void CBytHTDlg::OnCommMscomm1(CString Name) 
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[1024]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;

variant_inp=m_com1.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组
}
if(Name == "wen")
{
BYTE btWenHi1, btWenLo1, btShiHi1, btShiLo1;
for(k = 0; k < len; k++) //将数组转换为Cstring型变量
{
BYTE bt = *(char*)(rxdata + k); //字符型
if(len > 6)
{
if(k == 3)
btShiHi1 = bt;
else if(k == 4)
btShiLo1 = bt;
else if(k == 5)
btWenHi1 = bt;
else if(k == 6)
btWenLo1 = bt;
}
}
if(len > 6)
{
m_fSD1 = //(float) 
(btShiHi1 * 256 + btShiLo1)/10.0;
m_fWD1 = //(float) 
(btWenHi1 * 256 + btWenLo1)/10.0;
}
m_fSD1 = (m_fSD1)/10;
m_fWD1 = (m_fWD1)/10-273.15;
::Sleep(300);
sShi1.Format("%.2f", m_fSD1);
sWen1.Format("%.2f", m_fWD1);
}
}程序大概是这样,我如果不运行 OnCommMscomm1(Name);  ///*******///   这句话的话 程序内存不增加,运行这句话,内存就是4k4k的增加,不是马上增加 是程序运行起来后 等 6 7分钟后才慢慢增加 每次4K 请问 OnCommMscomm1(Name);  这个函数哪里存在内存泄露了吗???谢谢指出

解决方案 »

  1.   

    按从来都认为是timer的问题。
      

  2.   

    1.
    内存分配的最小单位一般是4K或8K. 只要你的程序向OS申请更多的内存,哪怕只是一个字节,OS给你的进程也是一个最小单位.2.
    应该是这里有问题
    variant_inp=m_com1.GetInput(); //读缓冲区 
    试试这样:
    COleVariant  varReceive;
    varReceive.Attach(m_com1.GetInput());
      

  3.   


    我也怀疑过TIMER 但是如果单独运行TIMER的话 不会出现这种情况....我很迷茫
      

  4.   

    int len = String2Hex(sendData1, hexdata); //此处返回的len可以用于计算发送了多少个十六进制数 
    m_com1.SetOutput(COleVariant(hexdata)); //这一句也用attatch改改 String2Hex没什么问题?  
      

  5.   

    int CHTDlg::String2Hex(CString str, CByteArray &senddata)
    {
    int hexdata, lowhexdata;
    int hexdatalen = 0;
    int len = str.GetLength();
    int len2 = str.GetLength();
    senddata.SetSize(len / 2);
    senddata.SetSize(len2 / 2);
    for(int i = 0; i < len; )
    {
    char lstr, hstr = str[i];
    if(hstr == ' ')
    {
    i++;
    continue;
    }
    i++;
    if(i >= len)
    break;
    lstr = str[i];
    hexdata = ConvertHexChar(hstr);
    lowhexdata = ConvertHexChar(lstr);
    if((hexdata == 16) || (lowhexdata == 16))
    break;
    else 
    hexdata=hexdata*16+lowhexdata;
    i++;
    senddata[hexdatalen]=(char)hexdata;
    hexdatalen++;
    }
    senddata.SetSize(hexdatalen);
    return hexdatalen;
    }char CHTDlg::ConvertHexChar(char ch)
    {
    if((ch >= '0' ) && (ch <= '9'))
    {
    return ch - '0';//0x30;
    }
    else if((ch >= 'A' ) && (ch <= 'F'))
    {
    return ch - 'A' + 10;
    }
    else if(( ch >= 'a') &&( ch <= 'f'))
    {
    return ch - 'a' + 10;
    }
    else 
    {
    return (-1);
    }
    }这2个函数是这样的
      

  6.   

    timer,就像多线程一样,处理不好的话内存泄漏多多
      

  7.   

    按你的设置OnCommMscomm1()每1ms来一次,你这样的处理是不是有问题,OnCommMscomm1应该只管接收,其他处理(什么rxdata[1024]等)应该放主程序中。
      

  8.   

    强烈建议不要用这个控件,直接API,这样会好得多。我是吃过亏的!!