我根本没有new内存,怎么会造成内存泄露的啊!!!可是内存不断的向上增长,就是这个函数的问题,把这个函数注释了就没事了,究竟是怎么回事啊?我研究了一天了,没找到原因啊,求求大家,救救我把,谁帮我解决了,小弟愿把所有分奉上,若要源码的话,请加QQ:183181455void CLRCDlg::ShowUpdate(BOOL isActive)
{
if (m_sshow == "")
{
m_sshow = _T("……");
}


Graphics g(m_memoryDC);//创建GDI+对象
g.SetSmoothingMode(SmoothingModeAntiAlias);//使用反走样
CPoint pt(0,0);//表示对话框的左上角
CPoint pos;//存储对话框的屏幕坐标 CRect rect;
GetWindowRect(rect);//获得窗口的屏幕坐标
pos.x = rect.left;
pos.y = rect.top; CSize sz;
sz.cx = 800;
sz.cy = 70; //通过指定的 BLENDFUNCTION对象 对原位图和目标位图的混合进行控制
BLENDFUNCTION b;
//AlphaFormat有两个选择:0表示常量alpha值,AC_SRC_ALPHA表示每个像素有各自的alpha通道。
b.AlphaFormat = AC_SRC_ALPHA;//混合模式
b.BlendFlags = 0;//保留选项
b.BlendOp = AC_SRC_OVER;//指明了源混合操作,但只支持AC_SRC_OVER,即根据源alpha值把源图像叠加到目标图像上。
b.SourceConstantAlpha = 255; FontFamily font(L"黑体");
GraphicsPath path,path3;
string fface=(string)m_sshow;
//转换为宽字符
WCHAR wfface[200];
MultiByteToWideChar(CP_ACP,0,fface.c_str(),static_cast<int>(fface.length())+1,
wfface,static_cast<int>(fface.length())+1);
//得到歌词的像素宽度
REAL width;
width = GetStringWidth(wfface,font,55,&g); //把歌词写入路径中
path.AddString(wfface,
-1,
&font,
FontStyleRegular,
55,
RectF(DrawProgressRect(width).X,5,2000,65),
NULL); //本区域 为歌词和当前卡拉OK应播放到的位置进行组合,达到卡拉OK效果
Region region(&path);
region.Intersect(Rect(0,0,DrawProgressRect(width).Width,65));
//背景路径
path3.AddRectangle(RectF(0,0,800,80)); SolidBrush bk(Color(128,128,128,128));
LinearGradientBrush bin(PointF(0,0),PointF(0,80),Color(255,0,0,255),Color(255,0,255,0));;//图形填充画刷(线变画刷)
LinearGradientBrush karaOK(PointF(0,0),PointF(0,80),Color(255,255,128,0),Color(255,128,50,200));;//图形填充画刷(线变画刷)
Pen pyy(Color(100, 0, 0,0),2.0f);
//通过给定的条件,以决定是否绘制背景
if(isActive)
{
g.FillPath(&bk,&path3);
} //绘制图形
g.FillPath(&bin,&path); //填充路径
g.DrawPath(&pyy, &path);//描边
//用另一个画刷填充区域,卡拉OK效果
g.FillRegion(&karaOK,&region);
::UpdateLayeredWindow(m_hWnd,this->GetDC()->m_hDC,&pos,
&sz,m_memoryDC.m_hDC,&pt,0,&b,2);
}

解决方案 »

  1.   

    WCHAR wfface[200];
    字符串没释放?
      

  2.   

    Graphics g(m_memoryDC);//创建GDI+对象
      

  3.   

    在MFC里面怎么释放GDI+对象啊,这位大哥能说详细点吗?
      

  4.   

    你这内存要泄露死,Graphics要用Graphics::Clear 释放
      

  5.   


    GetDC()只在OnInitDialog()里用了一次,可是内存却一直在增加,应该不是这个问题。
      

  6.   


    这个函数怎么用啊 
    MSDN的声明Status Clear(const Color &color);
    不像是释放内存的函数啊?
      

  7.   

    我跟踪一天了 也没找到原因,关键我刚接触gdi+,不太明白它怎么用啊。
      

  8.   

    这个函数是这样的,把你的DC清空,用一种颜色填充,你也可以用Color blueColor(0, 0, 0, 0);填充,颜色耗的内存基本可以忽略,但是DC就耗费相当大了
      

  9.   

    MSDN上的例子
    VOID Example_Clear(HDC hdc)
    {
       Graphics graphics(hdc);   // Create a Color object.
       Color blueColor(255, 0, 0, 255);   // Clear the screen with a blue background.
       graphics.Clear(blueColor);
    }
    你这样试试,把你那个函数中创建的Graphics再不用的时候都Clear掉
      

  10.   


    在UpdateLayeredWindow貌似使用了GetDC,ShowUpdate这个函数只在OnInitDialog里用一次?::UpdateLayeredWindow(m_hWnd,this->GetDC()->m_hDC,&pos,
            &sz,m_memoryDC.m_hDC,&pt,0,&b,2);
      

  11.   

    ----------------------------------
    这种问题都问的出来,4个裤衩怎么拿到的! -_-!下面回答楼主问题这句 Graphics g(m_memoryDC); 后面的全都注释掉,跑一跑,看内存是否泄漏还有这三句
        string fface=(string)m_sshow;
        //转换为宽字符
        WCHAR wfface[200];
        MultiByteToWideChar(CP_ACP,0,fface.c_str(),static_cast<int>(fface.length())+1,
                            wfface,static_cast<int>(fface.length())+1); 
    把这三句注释掉,加一句
    char fface[256] = "test";
    测试跑一下看有没有内存泄漏其他地方内存泄漏可能性不大
      

  12.   

    问题出在最后一句:
    ::UpdateLayeredWindow(m_hWnd,this->GetDC()->m_hDC,&pos,
            &sz,m_memoryDC.m_hDC,&pt,0,&b,2);GetDC请注意与ReleaseDC配对使用:
    CDC* pDC=GetDC();
    ::UpdateLayeredWindow(m_hWnd,pDC->m_hDC,&pos,
            &sz,m_memoryDC.m_hDC,&pt,0,&b,2);
    ReleaseDC(pDC);
      

  13.   

    14楼的!! 我告诉你!
    太谢谢你了!!!
    果然 是我这猪头没释放DC。还有16楼的哥们,谢谢你。我加上这句后大量的内存泄露没有了,可是内存还是慢慢的向上涨。我怀疑别的地方也有问题,
    Path 在AddString之后,需要手动释放吗?
    Graphics对象需要手动释放吗?同样感谢15楼的建议,我一会按你的建议再DEBUG一下。
      

  14.   


    GDI+的Path和Graphics对象超出作用域会自动析构,不必手动释放。
    至于内存缓慢上升,可能是正常现象,如果到了一定值不再上升,就不要紧张。如果还是一直上升,可能是其他地方有问题,至少你贴的代码俺没看出其他的问题。
      

  15.   

    只有一个问题就是没有RELEASEDC,那个PATH.ADDSTRING  肯定会不断的增加内存的,每调用一次就要增加一个字串的大小,你只要注意在项目清理工作的时候调用删除操作就可以了。相信你的path是类成员吧,只要在析构函数调移除链就OK了。