win7 vc2008 vc1.在调试环境下(debug release)均不出现泄漏情况2.但是当我把release后的exe单独运行时出项泄露已查明泄露位置(保证):
int i=::DeleteDC(m_hdcBottom);//调试环境中i=1;成功 HDC hDC = ::GetDC(NULL); m_hdcBottom=::CreateCompatibleDC(hDC);//m_hdcBottom为全局hdc ,必须为全局难道1,2情况是调用的是不同的库,一个是系统的,一个是vc带的,不明白如何解决呢

解决方案 »

  1.   

    GetDC需要ReleaseDC,CreateCompatibleDC需要DeleteDC。你可以用显示消息框或者写日志的方式输出HDC的值,看看执行过程中是否发生了变化。
      

  2.   

    补充一下,也可能是DeleteDC在单独运行时没有执行到。
    在IDE中运行和单独运行的主要差别有两点:
    1、进程的“当前目录”不同,由此可能导致程序使用相对路径找不到某些文件。
    2、进程的权限不同,在IDE中运行是继承了VS进程的权限,比单独运行的权限高一些,某些需要特殊权限才能执行的操作在单独运行时会失败。
      

  3.   

    void CLyricFakeDlg::Refresh()
    {
    //-------------------------------------- 防止 刷新冲突
    if( m_bIsRefreshing )
    return;
    m_bIsRefreshing = TRUE; ::SelectObject(m_hdcBottom, m_bmpBottomOld);
    ::SelectObject(m_hdcMask, m_hbmpMaskOld); //-------------删除m_hbmpMem
    // ::DeleteObject(m_hbmpMask);
    // ::DeleteObject(m_bmpBottom);// ::DeleteDC(m_hdcBottom);
    // ::DeleteDC(m_hdcMask); HDC hDC = ::GetDC(NULL);// m_hdcMask = ::CreateCompatibleDC(hDC);
    // m_hdcBottom=::CreateCompatibleDC(hDC);
    m_bmpBottom=CreateCompatibleBitmap(hDC,m_szWin.cx,m_szWin.cy);
    m_hbmpMask=CreateCompatibleBitmap(hDC,m_szWin.cx,m_szWin.cy);
    ::ReleaseDC(0,hDC); //------------- 文字path
    FontFamily fontFamily( g_strFont.AllocSysString() );
    StringFormat strformat;
    strformat.SetAlignment(StringAlignmentCenter );
    strformat.SetFormatFlags(StringFormatFlagsLineLimit );
    GraphicsPath path;
    path.AddString( m_lyric[m_nCurrentLine].strLyric.AllocSysString(), 
    wcslen(m_lyric[m_nCurrentLine].strLyric.AllocSysString()),
    &fontFamily, 
    FontStyleRegular, 
    g_FontSize , 
    RectF( 2 , 2 , m_szWin.cx-4 ,m_szWin.cy-4 ) , 
    &strformat  );
    //------------- 边框
    Pen penOut(Color(g_rgbBorderColor.Red,g_rgbBorderColor.Green,g_rgbBorderColor.Blue), 2);
    // penOut.SetLineJoin( LineJoinRound );//最好有
    //-------------------------------------- 开始绘制背景HDC m_hdcBottom// m_bmpBottom = ::CreateDIBSection(NULL, (PBITMAPINFO)&m_stBmpInfoHeader, DIB_RGB_COLORS, NULL , NULL, 0); m_nLeftPos=m_szWin.cx/2.0-m_lyric[m_nCurrentLine].strLyric.GetAllocLength ()*g_FontSize/4.0;
    if(m_bmpBottom)   
    {
    //------------- 开始绘制
    m_bmpBottomOld = (HBITMAP)::SelectObject( m_hdcBottom, m_bmpBottom);
    Graphics graphics(m_hdcBottom);
    graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
    //------------- 背景
    graphics.DrawImage( m_pImage, 0, 0, m_szWin.cx, m_szWin.cy);
    //------------- 边框
    graphics.DrawPath(&penOut, &path);
    //------------- 阴影
    for(int i=1; i<5; ++i)
    {
    Pen pen( Color( g_rgbTextShadow.Alpha,g_rgbTextShadow.Red,g_rgbTextShadow.Green,g_rgbTextShadow.Blue ), 2*i );
    pen.SetLineJoin( LineJoinRound );
    graphics.DrawPath(&pen, &path);
    }
    //------------- 填充
    SolidBrush brush( Color( g_rgbTextFill.Red ,g_rgbTextFill.Green , g_rgbTextFill.Blue ) );
    path.SetFillMode(FillModeWinding);
    graphics.FillPath(&brush, &path);
    }
    //-------------------------------------- 开始绘制蒙板HDC m_hdcMask
    //-------------
    // m_hbmpMask= ::CreateDIBSection(NULL, (PBITMAPINFO)&m_stBmpInfoHeader, DIB_RGB_COLORS, NULL, NULL, 0);
    if(m_hbmpMask)
    {
    //------------- 开始绘制
    m_hbmpMaskOld = (HBITMAP)::SelectObject( m_hdcMask, m_hbmpMask);
    Graphics graphics(m_hdcMask);
    graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
    //------------- 背景
    graphics.DrawImage( m_pImage, 0, 0, m_szWin.cx, m_szWin.cy);
    //------------- 边框
    graphics.DrawPath(&penOut, &path);
    //------------- 阴影
    for(int i=1; i<5; ++i)
    {
    Pen pen( Color( g_rgbMaskTextShadow.Alpha,g_rgbMaskTextShadow.Red,g_rgbMaskTextShadow.Green,g_rgbMaskTextShadow.Blue ), 2*i );
    pen.SetLineJoin( LineJoinRound );
    graphics.DrawPath(&pen, &path);
    }
    //------------- 填充
    SolidBrush brush( Color( g_rgbMaskTextFill.Red ,g_rgbMaskTextFill.Green , g_rgbMaskTextFill.Blue ) );
    path.SetFillMode(FillModeWinding);
    graphics.FillPath(&brush, &path);
    } m_bIsRefreshing = FALSE;
    }
      

  4.   

    我试了好多的方法了,都是那个情况,单独运行exe,还是泄露如何解决呢,还是代码的问题,(一定是这个函数的问题)
      

  5.   

    GetDC 可以不ReleaseDC,因为GetDC 只能获取到指针.
    也就是你只能CDC* pDC = GetDC ,而不能CDC dc = *(GetDC());
    而你所获得的这个pdc也只在当前函数中有效... 你可以试试给视图添加个成员变量 CDC* m_dc = GetDC
    在另1个函数里使用m_dc会出问题...
    CreateCompatibleDC 不调用DeleteDC 也不会内存泄露.
      

  6.   

    从代码中不容易看出问题,你先确认一下DeleteDC有没有执行到,HDC的值是否正确,然后再分析问题是由什么地方引起的。