内存一直增大问题

chenghu19860527 2009-01-18 03:21:53
做了一个小程序,通过串口发数据,然后接收数据,根据接收的数据来查找数据库,用列表控件显示所查信息。
程序是这样运行的:每一秒向串口发送数据,每2.5秒读取数据,然后查找数据库。
问题是:程序一直运行,其所占的内存也不断增大,平均以4K增加,用内存检测工具查了,也没报告有内存泄露,还有
当程序最小化时,其所占内存又恢复到原来量,然后还是增加。

整了几天了,不知道原因究竟在那,请各位高手指点。
...全文
320 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
做鸡真好吃 2009-01-19
  • 打赏
  • 举报
回复
我以前也做过串口接收的软件,后来的问题是由于界面美化,造成了最大最小化时候内存泄露
chenghu19860527 2009-01-19
  • 打赏
  • 举报
回复
pstr我注释掉了,没有用
Gavin001 2009-01-19
  • 打赏
  • 举报
回复
有些测试工具检查不到bstr类型的泄露
前段时间我也做过类似的测试
用CMemoryState类测试时发现检查不到BSTR的泄露
ccpaishi 2009-01-18
  • 打赏
  • 举报
回复
是啊,楼主申请的pstr free了没有
菜牛 2009-01-18
  • 打赏
  • 举报
回复
pstr在哪里删除了?
qq14923349 2009-01-18
  • 打赏
  • 举报
回复
访问频繁
完毕
chenghu19860527 2009-01-18
  • 打赏
  • 举报
回复
我用的Visual Leak Detector,还有BChecker
关键代码如下:
//设置定时器
SetTimer(123,2500,NULL);//读取返回信息的卡号定时器
SetTimer(456,1000,NULL);//发送命令定时器
void CKJShowDlg::OnTimer(UINT nIDEvent)
{
/*******************************************************************
读取返回信息截取卡号部分,根据卡号访问数据库,显示人员详细信息
*******************************************************************/
if(nIDEvent==123)
{

if(ReturnStr.IsEmpty())
{
KillTimer(123);
AfxMessageBox("无返回数据,请确认串口和分站地址是否正确");
m_btnOpenPort.EnableWindow(TRUE);
m_Com.EnableWindow(TRUE);
m_editAddr.EnableWindow(TRUE);
return;
}
//截取字符串
strMid=ReturnStr.Mid(30);
//除去字符串中的空格
strMid.Remove(' ');
//截取卡号部分
strMid=strMid.Left(strMid.GetLength()-4);
//每四个字符为一个卡号,将其存入CStringArray定义的字符串数组里
//////////////////////////////////////////////////
//设置数组大小
card.RemoveAll();
card.SetSize(strMid.GetLength()/4);
for(int i=0;i<strMid.GetLength();i+=4)
{
card.Add(strMid.Mid(i,4));
}
///////////////////////////////////////////////////////
//访问数据库
m_pRecordset.CreateInstance("ADODB.Recordset");
try
{
CString sql="select * from jk_V_IdCardConfig";
m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText);

while(!m_pRecordset->adoEOF)
{
ClerkId = m_pRecordset->Fields->GetItem("ClerkId")->Value.bstrVal;
ClerkName=m_pRecordset->Fields->GetItem("ClerkName")->Value.bstrVal;
DepartmentName=m_pRecordset->Fields->GetItem("DepartmentName")->Value.bstrVal;
DutyName=m_pRecordset->Fields->GetItem("DutyName")->Value.bstrVal;
WorkTypeName=m_pRecordset->Fields->GetItem("WorkTypeName")->Value.bstrVal;
for(int i=0;i<card.GetSize();i++)
{
if(card[i]==ClerkId)
{
m_ctrlList.InsertItem(a,ClerkId);
m_ctrlList.SetItemText(a,1,ClerkName);
m_ctrlList.SetItemText(a,2,DepartmentName);
m_ctrlList.SetItemText(a,3,DutyName);
m_ctrlList.SetItemText(a,4,WorkTypeName);
t=CTime::GetCurrentTime();
CurrentTime=t.Format("%Y-%m-%d %H:%M:%S");
m_ctrlList.SetItemText(a,5,CurrentTime);
a++;
///实现滚屏显示
if(m_chkScroll.GetCheck()==1)
m_ctrlList.EnsureVisible(a-1,TRUE);
if(a==1000)
{
a=0;
m_ctrlList.DeleteAllItems();
}
break;
}
}
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_pRecordset.Release();
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("访问数据库失败!\r\n错误信息:%s",(char*)e.Description());
AfxMessageBox(errormessage);///显示错误信息
m_pRecordset->Close();
m_pRecordset.Release();
card.FreeExtra();
card.RemoveAll();
//将返回的字符串重新置零
ReturnStr.Empty();
strMid.Empty();
return ;
}
card.FreeExtra();
card.RemoveAll();
//将返回的字符串重新置零
ReturnStr.Empty();
strMid.Empty();
}
/***************************************
发送读取在线人员信息命令
***************************************/
if(nIDEvent==456)
{
// UpdateData();
//获取当前时间
t=CTime::GetCurrentTime();

//以下转化成命令格式
m_strAddress.Remove(' ');
strH=m_strAddress.Left(2);
strL=m_strAddress.Right(2);
sscanf(strH,"%x",&H2);
sscanf(strL,"%x",&L2);
strcommend="FE10";
strcommend += m_strAddress;
strcommend += "0000";
strcommend += m_strAddress;
strcommend += "0000";
strcommend += "040007";

//十进制转化成十六进制字符串,数据位部分
strtmp.Format("%04X",t.GetYear());
/////////////////////////
strH=strtmp.Left(2);
strL=strtmp.Right(2);
sscanf(strH,"%x",&H);
sscanf(strL,"%x",&L);
//////////////////////////////////
strcommend +=strtmp;
strtmp.Format("%02X",t.GetMonth());
strcommend +=strtmp;
strtmp.Format("%02X",t.GetDay());
strcommend +=strtmp;
strtmp.Format("%02X",t.GetHour());
strcommend +=strtmp;
strtmp.Format("%02X",t.GetMinute());
strcommend +=strtmp;
strtmp.Format("%02X",t.GetSecond());
strcommend +=strtmp;

//求校验位
checksum=0x10+H2+L2+H2+L2+0x04+0x07+H+L+t.GetMonth()+t.GetDay()+t.GetHour()+t.GetMinute()+t.GetSecond();
check=0xFF-checksum%256+1;

strtmp.Format("%02X",check);
strcommend +=strtmp;
strcommend +="0D";
////////////发送命令
len=StringHex(strcommend,data);

//////////////////////////////
/***** pstr=NULL;
pstr=(char*)malloc(sizeof(char)*hexdata.GetSize());
for(int k=0;k<hexdata.GetSize();k++)
{
pstr[k]=hexdata.GetAt(k);
}
**************************************************************/
/////////////////////////////////
// try
// {
if(!m_bSerialPortOpened)
return; //检查串口是否打开
m_SerialPort.WriteToPort(data,len);//发送数据

strcommend.Empty();
strtmp.Empty();
strH.Empty();
strL.Empty();
temp.Empty();

// }
// catch(CException e)
// {
/// KillTimer(456);
// TCHAR szCause[255];
// CString strFormatted;
// e.GetErrorMessage(szCause, 255);
// strFormatted = szCause;
// AfxMessageBox(strFormatted);
// return;
// }

}
//////////////////////////////////////////////////////////////////////
CDialog::OnTimer(nIDEvent);
}
Fireway2008 2009-01-18
  • 打赏
  • 举报
回复
内存检测工具查了?
你是用什么工具呢?
也许是资源泄露,不然没理由内存占用一直增加,把可疑代码贴出来让大家看看。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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