串口通信中的内存溢出问题,急!急!急!

whiteluobo 2007-08-02 10:50:18
我采用MSComm控件实现串口通信,其OnComm响应函数如下:
void CTestView::OnOnCommMscomm1()
{
switch(m_Com.GetCommEvent())
{
case 1:
break;
case 2:
GetCommData();
UpdateData(FALSE);
break;
default:
AfxMessageBox(m_Com.GetCommEvent());
m_Com.SetInBufferCount(0);
m_Com.SetOutBufferCount(0);
break;
}
}

void CTestView::GetCommData()
{
CString strTemp;
LONG len,j;
BYTE rxdata[2048]={0};
VARIANT variant_inp;
COleSafeArray safearray_inp;
CString m_strForAngle;

variant_inp=m_Com.GetInput();
safearray_inp=variant_inp;
len=safearray_inp.GetOneDimSize();
for (j=0;j<len;j++)
{
safearray_inp.GetElement(&j,rxdata+j);
BYTE bt=*(char*)(rxdata+j);
strTemp.Format("%02X",bt); //16 hex
if (strTemp=="AA")
{
DrawMeter(m_strForAngle);
m_strForAngle="";
}
m_strForAngle+=strTemp;
}
VariantClear(&variant_inp);//此处释放内存,加了之后好了一点。
}

其中,DrawMeter(CString strForAngle)是一绘制界面函数,DrawMeter()里面还有函数调用,不知道还要不要贴出来。

串口一直在发数据,但上面程序运行一段时间之后就内存泄露。请大侠们看看,哪里出问题了。
万分感谢!
...全文
698 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
whiteluobo 2007-08-03
  • 打赏
  • 举报
回复
也试过了,可就是不行。将
strTemp3=strForAngle.Mid(6,4);
m_nAngleY=HexToInt(strTemp3)*0.001; //Y轴倾角
注释了,怎么都行;不注释,怎么都不行,跑一会儿就溢出了。
jasonshark 2007-08-03
  • 打赏
  • 举报
回复
那HexToInt(CString strInput)中有没有我说得那种情况?
jasonshark 2007-08-03
  • 打赏
  • 举报
回复
实在不行把HexToInt改成不使用CString的吧
直接传字符串指针,用字符穿操作函数来做试
whiteluobo 2007-08-03
  • 打赏
  • 举报
回复
还是不行。
whiteluobo 2007-08-03
  • 打赏
  • 举报
回复
我也觉得atoi看着有点怪怪的。回头再看看他究竟有什么蹊跷吧。
jasonshark 2007-08-03
  • 打赏
  • 举报
回复
内存泄漏没找出来
但atoi那个地方有隐患, 先改过来看看

char chTemp[2] = {0};
chTemp[0] = chTemp=strTemp[0];
switch(chTemp[0])
{
...
default:
num1=atoi(chTemp);
}

另外,最好把HexToInt该成传引用参数HexToInt(CString & strInput)
whiteluobo 2007-08-03
  • 打赏
  • 举报
回复
jasonshark(没暑假了...) ,你是对的。
whiteluobo 2007-08-03
  • 打赏
  • 举报
回复
奇怪,我另外专门写了一个例程,让m_nAngleY也用起来,还是要泄露。这样说来,应该是连续两次调用HexToInt的蹊跷才对。我贴出来,麻烦大家分析一下。
int CTestView::HexToInt(CString strInput)
{
int nReturn = 0;
int nLength,num1;
CString strTemp=strInput;
char chTemp;

nLength=strTemp.GetLength();
for(int i=0;i<nLength;i++) //数据转换
{
chTemp=strTemp.GetAt(0);
strTemp.Delete(0,1);
switch(chTemp)
{
case 'A':
num1=10;
break;
case 'B':
num1=11;
break;
case 'C':
num1=12;
break;
case 'D':
num1=13;
break;
case 'E':
num1=14;
break;
case 'F':
num1=15;
break;
default:
num1=atoi(&chTemp);
break;
}
nReturn=nReturn*16+num1;
}

return nReturn;
}
jasonshark 2007-08-03
  • 打赏
  • 举报
回复
HexToInt...把这个代码贴出来
我一直就在怀疑是这个函数的问题
whiteluobo 2007-08-03
  • 打赏
  • 举报
回复
谢谢,太感谢你们了。我将下面这两句屏蔽了就没问题了。
strTemp3=strForAngle.Mid(6,4);
m_nAngleY=HexToInt(strTemp3)*0.001; //Y轴倾角
这是串口一帧中的数据内容,但是这里不需要,我原本以为放在这里不会有问题的呢。
谢谢,谢谢。

不过我还不是很清楚,不需要用的参数,它究竟怎样耗内存的?

whiteluobo 2007-08-03
  • 打赏
  • 举报
回复
谢谢你们。
HexToInt(CString strInput) 中应该没有,因为这个函数也比较简单。
我先按slek(我浮躁,可是我很厚道!) 的方法再试试看。昨天这样做了一些,但是没有找出地方。
不知道上面这些内容还有没有哪里是本身需要强行释放的。
西山小月 2007-08-02
  • 打赏
  • 举报
回复
可以这样,把你认为可疑的函数依次注释掉,注释掉后看看还有没有内存泄漏,如果没有的话,就说明错误是出在这个被注释掉的函数身上,然后重点测试这个函数,用相同方法测试每一个语句
whiteluobo 2007-08-02
  • 打赏
  • 举报
回复
没有啊

void CTestView::DrawMeter(CString strForAngle)
{//从串口获得的一组数据(字头为“AA”)中
//提取X倾角,并画在m_MeterAngle中
int len;
double m_nAngleX,m_nAngleY;
CString strTemp2,strTemp3;

if (strForAngle=="AA" | strForAngle=="")
return;

len=strForAngle.GetLength();
strForAngle.MakeUpper();
strTemp2=strForAngle.Left(2); //第1字节 AA 字头
if (strTemp2=="AA") //??是否需要循环取字头 来做判断
{
strTemp3=strForAngle.Mid(2,4);
m_nAngleX=HexToInt(strTemp3)*0.001; //X轴倾角
m_nAngle1=m_nAngleX;

strTemp3=strForAngle.Mid(6,4);
m_nAngleY=HexToInt(strTemp3)*0.001; //Y轴倾角

m_MeterAngle.Update(m_nAngleX); //更新虚拟仪表显示
//此处函数肯定没问题
UpdateData(FALSE);
}
}

HexToInt(CString strInput) 是将一个16进制数转换为10进制int
jasonshark 2007-08-02
  • 打赏
  • 举报
回复
贴出来吧
先检查一下CString有没有GetBuffer而没有ReleaseBuffer?

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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