关于内存泄漏的问题,高手请进,送分多多!!!
小弟最近在做一个小项目,现在遇到了很棘手的内存泄漏问题。当程序激活时,占用的内存有10多M,而当程序最小化之后,占用的内存只有五M左右,是不是OnDraw函数中有内存泄漏啊(界面上有32个Gif,使用的CPictureEx类),当程序运行了十个小时左右,程序战胜的内存就激增至120多M!!!!测试时,我每0.05秒查询一次数据库,并更新MSFlexGrid中的数据,发现内存每一秒就多占用4K多的内存,这个问题怎么解决啊。急急急,项目只有几天就要交付使用了,问题还有一大堆。小弟另外开了一个贴,是关于网络的
http://community.csdn.net/Expert/topic/4188/4188688.xml?temp=.6668207
请大家多多关注小弟的帖子,小弟有一千多分,大家不要担心分的问题
问题点数:100、回复次数:13Top
1 楼slek(我浮躁,可是我很厚道!)回复于 2005-08-04 14:48:56 得分 16
程序运行了10个小时才涨到120M,说明有小量的内存没释放,不知道是不是数据库那里的问题。Top
2 楼twinboys()回复于 2005-08-04 14:50:50 得分 16
能不能说的细一点,可以是内存泄露Top
3 楼honker110(honker)回复于 2005-08-04 14:55:35 得分 17
0.05秒就查询一次数据库也太频繁了吧?
不过这么频繁查询倒不像是这里的问题,应该是别的地方泄漏了吧?Top
4 楼dirdirdir3(风)回复于 2005-08-04 14:58:11 得分 20
使用boundschecker查查哪里出了问题啊。Top
5 楼jjiaming(阿熊)回复于 2005-08-04 14:59:22 得分 0
CRect rect ;
GetClientRect(&rect);
int nWidth,nHeight;
rect.top += TopExtra;
nWidth = (rect.Width() - nEWidth * ( nColumn + 1)) / nColumn ;
nHeight = rect.Height() / nRow - nEHeight;
int count = 0;
int count1 = 20;
int start ,end;
if(nCurScreen == 0 )
{
start = 0 ;
end = 4;
}
else
{
start = 4;
end = 8;
}
for(int i = start; i < end; i++)
{
for(int j = 0 ; j < nColumn; j ++)
{
CRect TempRect,PicRect;
TempRect.left = (j + 1) * nEWidth + j * nWidth;
TempRect.right = TempRect.left + nWidth;
TempRect.top = (i + 1 ) * nEHeight + i * nHeight + TopExtra;
TempRect.bottom = TempRect.top + nHeight;
PicRect = TempRect;
PicRect.top += 25;
PicRect.bottom -= 25;
TempRect.top -= 3;
if(false == bMoved )
{
if(count1 < 32) {
((CWnd*)&m_gif[ count1 + 1])->MoveWindow(PicRect.left + 3,
PicRect.top, PicRect.Width(),PicRect.Height());
m_gif[count1 + 1].Stop();
}
else
((CWnd*)GetDlgItem(IDC_STATIC301 + count1 - 32)) ->MoveWindow(
PicRect.left + 3,
PicRect.top,
PicRect.Width(),
PicRect.Height());
((CWnd*)GetDlgItem(IDC_STATIC1 + count))->SetWindowPos(&wndTop,TempRect.left,
TempRect.top - 5 ,TempRect.Width(),TempRect.Height() + 5,SWP_SHOWWINDOW);
((CWnd*)GetDlgItem(IDC_STATIC101 + count))->SetWindowPos(&wndTop,TempRect.left + 3,
TempRect.top + 5,TempRect.Width() - 4,25,SWP_SHOWWINDOW);
((CWnd*)GetDlgItem(IDC_STATIC201 + count))->SetWindowPos(&wndTop,TempRect.left + 3,
PicRect.bottom + 4,PicRect.Width() - 4 ,14,SWP_SHOWWINDOW);
((CWnd*)&m_gif[ count + 1])->SetWindowPos(&wndTop,PicRect.left + 3,PicRect.top,
PicRect.Width(),PicRect.Height(),SWP_SHOWWINDOW);
m_gif[count + 1].Stop();
}
if(map[i][j] != NULL)
{
CString DevName = map[i][j]->GetDevName();
//dc->TextOut(TempRect.left + 4,TempRect.top + 7,DevName);
((CWnd*)GetDlgItem(IDC_STATIC101 + count))->SetWindowText(DevName);
if(map[i][j]->GetDevType() == 1)
{
int times = map[i][j]->GetTimes();
CString str;
str.Format("钩数:%d次",times);
// dc->TextOut(PicRect.left + 4, PicRect.bottom + 4,str);
((CWnd*)GetDlgItem(IDC_STATIC201 + count))->SetWindowText(str);
}
else if(map[i][j]->GetDevType() == 5)
{
int times = map[i][j]->GetTimes();
CString str;
str.Format("次数:%d次",times);
((CWnd*)GetDlgItem(IDC_STATIC201 + count))->SetWindowText(str);
}
else
{
int hour,min,sec;
map[i][j]->GetTime(&hour,&min,&sec);
CString str;
str.Format("累计时间:%d%d:%d%d:%d%d",hour/10,hour%10,min/10,min%10,sec/10,sec%10);
((CWnd*)GetDlgItem(IDC_STATIC201 + count))->SetWindowText(str);//dc->TextOut(PicRect.left + 4, PicRect.bottom + 4,str);
}
}
else
{
((CWnd*)GetDlgItem(IDC_STATIC201 + count))->SetWindowText("");
((CWnd*)GetDlgItem(IDC_STATIC101 + count))->SetWindowText("没有设备");
}
count++;
count1++;
}
}
if(bMoved == false)
{
DataManage.StartWork(this);
bMoved = true;
}Top
6 楼lixiaosan(小三)回复于 2005-08-04 15:01:05 得分 16
检查一下你的cdc的一些资源是否释放,
也只是猜测..Top
7 楼jjiaming(阿熊)回复于 2005-08-04 15:01:47 得分 0
不好意思,代码太乱,这是OnDraw()的代码Top
8 楼jjiaming(阿熊)回复于 2005-08-04 15:03:03 得分 0
CString strSQL,strDate;
strDate.Format("#%d-%d-%d#",year,month,day);
strSQL .Format("select 总次数,总开机时间,设备地址 from DayData where 日期 =%s ",strDate);
BSTR bstrSQL = strSQL.AllocSysString();
try{
int i = 1;
_variant_t TheValue; //VARIANT数据类型
CString value;
if (m_pRecordset != NULL && m_pRecordset->GetState() == adStateOpen)
m_pRecordset->Close();
m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConn,
adOpenDynamic,adLockReadOnly,adCmdText);
while(!m_pRecordset->adoEOF)//遍历所有记录
{
value.Format("%d",i);
TheValue.vt = VT_NULL;
TheValue = m_pRecordset->GetCollect("设备地址");
if(TheValue.vt!=VT_NULL)
{
value = (LPCTSTR)(_bstr_t)TheValue;
FlexGrid->SetTextMatrix(i,2,value);
int id = atoi(value);
FlexGrid->SetTextMatrix(i,1,Device[id].GetDevName());
}
TheValue.vt = VT_NULL;
TheValue = m_pRecordset->GetCollect("总次数");
if(TheValue.vt != VT_NULL)
{
value = (LPCTSTR)(_bstr_t)TheValue;
FlexGrid->SetTextMatrix(i,3,value);
}
else FlexGrid->SetTextMatrix(i,3," - ");
TheValue.vt = VT_NULL;
TheValue = m_pRecordset->GetCollect("总开机时间");
if(TheValue.vt != VT_NULL)
{
value = (LPCTSTR)(_bstr_t)TheValue;
FlexGrid->SetTextMatrix(i,4,value);
}
else FlexGrid->SetTextMatrix(i,4," - ");
m_pRecordset->MoveNext();
i++;
}
m_pRecordset->Close();
if( i == 1)
{
CString str;
str.Format("对不起,没有%d年%d月%d日的数据!",year,month,day);
AfxMessageBox(str);
}
::SysFreeString(bstrSQL);
return true;
}
catch(_com_error e)
{
if (m_pRecordset != NULL && m_pRecordset->GetState() == adStateOpen)
m_pRecordset->Close();
::SysFreeString(bstrSQL);
AfxMessageBox(e.ErrorMessage());
return false;
}
这是数据库访问的代码Top
9 楼jjiaming(阿熊)回复于 2005-08-04 15:08:02 得分 0
当程序由最大化后,内存慢慢地由5K左右增至12K左右,然后会缓慢地增加。关于CDC的资源,有一个CBrush,然后就是有32个CPictureEx对象,几个font对象,几个CBitmap 对象,都只分配了一次,我注意了new与delete是没有问题的,可能是其它隐性泄漏吧Top
10 楼boyplayee()回复于 2005-08-04 15:08:39 得分 15
检查一下,有没有用过delete...Top
11 楼jjiaming(阿熊)回复于 2005-08-04 15:10:05 得分 0
大家有没有用过CpictureEx啊,不会是这个有问题吧。Top
12 楼jjiaming(阿熊)回复于 2005-08-04 15:11:14 得分 0
用了啊,但都是在程序结束时用的啊Top
13 楼jjiaming(阿熊)回复于 2005-08-04 15:30:19 得分 0
大家说说一般内存的泄漏发生在什么地方Top




