内存问题,郁闷好久了,麻烦各位给点建议,帮忙顶的也有分。 我写的一个中间服务程序,用任务管理器看内存一直都在以4K的速度增加,在程序中我使用了new的地方都delete了。如果我把界面最小化一次后再最大化一次,那么内存又恢复正常了,是什么原因呢?而且我的内存增加基本上都是执行了4次左右的数据库操作后才增加的。ODBC的句柄每次执行后我都释放了,郁闷,麻烦给为大侠解决一下,拜谢!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 根据你说的内容没有办法来进行判断建议安装BoundsChecker来查内存泄漏 如果经过长时间的运行后,内存使用能够基本稳定,可以认为是没有Memory leak.否则得检查你的代码了。 nonocast说得没错,要用专用工具才看得出来。 长期运行以后看结果,不要做打开叶面的操作;OnPaint,容易出现问题,看看是不是有粘别人的代码 我的界面上的东西用了别人的控件和代码,不知道是不是那里面的原因。我使用了一个CAarray(char *,char *)的数组,对数组里面的元素都new了一把,使用完了也都delete了,这里会有问题吗? void CXTOutBarCtrl::OnPaint() { // background is already filled in gray CPaintDC dc(this); if (!m_bUserClrBack) { m_clrBack = bXPMode? clrXP3DFace : clr3DShadow; } if (!m_bUserClrText) { m_clrText = bXPMode? clrBtnText : clrWindow; } // Get the client rect. CRect rectClient; GetClientRect(&rectClient); // Paint to a memory device context to help // eliminate screen flicker. CXTMemDC memDC(&dc, rectClient,::GetSysColor(COLOR_3DFACE));//修改 int nSavedDC = memDC.SaveDC(); CRect rc; GetInsideRect(rc); if (!GetFolderChild()) { memDC.FillSolidRect(rc, m_clrBack); if (!bXPMode) { memDC.Draw3dRect(rc, clrWindowFrame, clr3DShadow); } } int max = m_arFolder.GetSize(); CRect frc; for (int t = 0; t < max; t++) { GetFolderRect(t, frc); DrawFolder(&memDC, t, frc, F_NORMAL); } if (!GetFolderChild()) { int f,l; GetVisibleRange(m_nSelFolder, f,l); m_rcUpArrow.SetRect(0,0,GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CXVSCROLL)); m_rcDownArrow = m_rcUpArrow; m_rcUpArrow.OffsetRect(rc.right - 5 - GetSystemMetrics(SM_CXVSCROLL), rc.top +5); m_rcDownArrow.OffsetRect(rc.right - 5 - GetSystemMetrics(SM_CXVSCROLL), rc.bottom - 5 - GetSystemMetrics(SM_CXVSCROLL)); if (f > 0) { if (m_bUpPressed) memDC.DrawFrameControl(m_rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED); else memDC.DrawFrameControl(m_rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP); m_bUpArrow = TRUE; memDC.ExcludeClipRect(m_rcUpArrow); } else m_bUpArrow = FALSE; if (l < GetItemCount() - 1) { if (m_bDownPressed) memDC.DrawFrameControl(m_rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED); else memDC.DrawFrameControl(m_rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN); m_bDownArrow = TRUE; memDC.ExcludeClipRect(m_rcDownArrow); } else m_bDownArrow = FALSE; PaintItems(&memDC, m_nSelFolder, rc); } dc.BitBlt(rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), &memDC, 0,0, SRCCOPY); memDC.RestoreDC(nSavedDC); if (m_nFolderHilighted >= 0) { int i = m_nFolderHilighted; m_nFolderHilighted = -1; HighlightFolder(i); } if (m_nItemHilighted >= 0) { int i = m_nItemHilighted; m_nItemHilighted = -1; HighlightItem(i, m_bPressedHighlight); }} 应该是windows系统的原因,你可以看看windows自带的程序比如notepad也是这样 昨天又仔细研究了一下,我认为情况可能是这样:vc编译器使用了Memory pool的概念,内存大小为某一时刻通过Memory Pool提交内存的最大值,Memory Pool从来都不向系统提交释放内存的请求,所以内存使用只会增加不会减少如果集中使用new和delete后虽然没有内存泄露,但可能造成内存浪费实际上最小化一次后再最大化一次虽然任务管理器中的内存使用减少了,但你用process viewer查看一下heap usage并不一定就减少了 学习用VC做数据库开发需要哪些知识点?(开发工具的?数据库的?) 请问这种tree怎么做出来的 求助……………… 请教,我用VC++6.0向导产生了一个MFC应用程序,经过修改后能在主窗口中画图形,请问如何将所画的这些图形一下子全部清除。 关于客户区大小 关于DrawDibDraw()的全屏显示图像 请教一个关于对话框指针的问题! 请问谁有<深入浅出MFC>电子版?能发给我吗? 如何在RichEdit控件显示编辑HTML格式的文件? 请问一个多文件源码怎样编译??? 模式对话框,不能正确显示。吐血送分100 获得键盘输入的问题
否则得检查你的代码了。
{
// background is already filled in gray
CPaintDC dc(this); if (!m_bUserClrBack)
{
m_clrBack = bXPMode?
clrXP3DFace :
clr3DShadow;
}
if (!m_bUserClrText)
{
m_clrText = bXPMode?
clrBtnText :
clrWindow;
} // Get the client rect.
CRect rectClient;
GetClientRect(&rectClient); // Paint to a memory device context to help
// eliminate screen flicker.
CXTMemDC memDC(&dc, rectClient,::GetSysColor(COLOR_3DFACE));//修改
int nSavedDC = memDC.SaveDC(); CRect rc;
GetInsideRect(rc);
if (!GetFolderChild())
{
memDC.FillSolidRect(rc, m_clrBack); if (!bXPMode) {
memDC.Draw3dRect(rc, clrWindowFrame, clr3DShadow);
}
} int max = m_arFolder.GetSize();
CRect frc;
for (int t = 0; t < max; t++)
{
GetFolderRect(t, frc);
DrawFolder(&memDC, t, frc, F_NORMAL);
}
if (!GetFolderChild())
{
int f,l;
GetVisibleRange(m_nSelFolder, f,l);
m_rcUpArrow.SetRect(0,0,GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CXVSCROLL));
m_rcDownArrow = m_rcUpArrow;
m_rcUpArrow.OffsetRect(rc.right - 5 - GetSystemMetrics(SM_CXVSCROLL), rc.top +5);
m_rcDownArrow.OffsetRect(rc.right - 5 - GetSystemMetrics(SM_CXVSCROLL), rc.bottom - 5 - GetSystemMetrics(SM_CXVSCROLL)); if (f > 0)
{
if (m_bUpPressed) memDC.DrawFrameControl(m_rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP|DFCS_PUSHED);
else memDC.DrawFrameControl(m_rcUpArrow, DFC_SCROLL, DFCS_SCROLLUP);
m_bUpArrow = TRUE;
memDC.ExcludeClipRect(m_rcUpArrow);
}
else m_bUpArrow = FALSE; if (l < GetItemCount() - 1)
{
if (m_bDownPressed) memDC.DrawFrameControl(m_rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN|DFCS_PUSHED);
else memDC.DrawFrameControl(m_rcDownArrow, DFC_SCROLL, DFCS_SCROLLDOWN);
m_bDownArrow = TRUE;
memDC.ExcludeClipRect(m_rcDownArrow);
}
else m_bDownArrow = FALSE; PaintItems(&memDC, m_nSelFolder, rc);
} dc.BitBlt(rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), &memDC, 0,0, SRCCOPY); memDC.RestoreDC(nSavedDC); if (m_nFolderHilighted >= 0)
{
int i = m_nFolderHilighted;
m_nFolderHilighted = -1;
HighlightFolder(i);
}
if (m_nItemHilighted >= 0)
{
int i = m_nItemHilighted;
m_nItemHilighted = -1;
HighlightItem(i, m_bPressedHighlight);
}
}
vc编译器使用了Memory pool的概念,
内存大小为某一时刻通过Memory Pool提交内存的最大值,
Memory Pool从来都不向系统提交释放内存的请求,所以内存使用只会增加不会减少
如果集中使用new和delete后虽然没有内存泄露,但可能造成内存浪费
实际上最小化一次后再最大化一次虽然任务管理器中的内存使用减少了,但你用
process viewer查看一下heap usage并不一定就减少了