我写的一个中间服务程序,用任务管理器看内存一直都在以4K的速度增加,在程序中我使用了new的地方都delete了。如果我把界面最小化一次后再最大化一次,那么内存又恢复正常了,是什么原因呢?而且我的内存增加基本上都是执行了4次左右的数据库操作后才增加的。ODBC的句柄每次执行后我都释放了,郁闷,麻烦给为大侠解决一下,拜谢!!!!

解决方案 »

  1.   

    根据你说的内容没有办法来进行判断建议安装BoundsChecker来查内存泄漏
      

  2.   

    如果经过长时间的运行后,内存使用能够基本稳定,可以认为是没有Memory leak.
    否则得检查你的代码了。
      

  3.   

    nonocast说得没错,要用专用工具才看得出来。
      

  4.   

    长期运行以后看结果,不要做打开叶面的操作;OnPaint,容易出现问题,看看是不是有粘别人的代码
      

  5.   

    我的界面上的东西用了别人的控件和代码,不知道是不是那里面的原因。我使用了一个CAarray(char *,char *)的数组,对数组里面的元素都new了一把,使用完了也都delete了,这里会有问题吗?
      

  6.   

    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);
        }
    }
      

  7.   

    应该是windows系统的原因,你可以看看windows自带的程序比如notepad也是这样
      

  8.   

    昨天又仔细研究了一下,我认为情况可能是这样:
    vc编译器使用了Memory pool的概念,
    内存大小为某一时刻通过Memory Pool提交内存的最大值,
    Memory Pool从来都不向系统提交释放内存的请求,所以内存使用只会增加不会减少
    如果集中使用new和delete后虽然没有内存泄露,但可能造成内存浪费
    实际上最小化一次后再最大化一次虽然任务管理器中的内存使用减少了,但你用
    process viewer查看一下heap usage并不一定就减少了