【问题标题】:GDI Leak ProblemGDI 泄漏问题
【发布时间】:2010-10-03 16:23:51
【问题描述】:

我注意到使用任务管理器时,以下代码中存在 GDI 泄漏。执行此代码的进程中 GDI 对象的计数每次执行时都会增加 1,但我似乎找不到问题。

任何帮助将不胜感激。

// create new DC based on current    
HDC hDC = CreateCompatibleDC(GetDC());
// select a bitmap into the new DC and keep the old one
HGDIOBJ hOldObj = SelectObject (hDC,hBM);
// do somthing here --> 100% no leak here
SomeFunction (hDC);
// select the old object back from whence it came and delete whats returned   
DeleteObject (SelectObject (hDC,hOldObj));
// delete the DC
DeleteDC(hDC);
// delete the tmp object
DeleteObject (hOldObj);

RM

【问题讨论】:

  • 一般来说嵌套调用不是一个好主意,即 HDC hDC1 = GetDC(); HDC hDC2 = CreateCompatibleDC(hDC1); .. 而不是 HDC hDC = CreateCompatibleDC(GetDC()); (顺便说一句,在您的代码中,GetDC 返回的 HDC 未被释放。)
  • xhantt:这不是答案吗?把评论删掉,放到回答区。
  • 所以修复只是针对 getDC 返回的 ReleaseDC 吗?如果我理解正确,请在答案部分写下这个答案,以便我们投票。
  • 顺便说一句,不要DeleteObject(hOldObj)。那不是你要清理的对象。你没有创建它,所以不要删除它。
  • 你可以使用 valgrind 或 deleaker。但是deleaker这个名字不言自明)

标签: c winapi gdi


【解决方案1】:

(我正要说这个时,我注意到已经有评论回答了 - 归功于 xhantt)

我不认为 GetDC() 在第一行创建的 dc 被释放。

【讨论】:

    【解决方案2】:

    确保在从 GetDC 返回的句柄上调用 ReleaseDC 而不是 DeleteDC

    【讨论】:

      【解决方案3】:

      从评论中复制,我没有把它作为答案,因为我无法测试它,我不确定它是否正确,请测试它。

      一般来说,嵌套调用并不是一个好主意,即

      HDC hDC1 = GetDC(); 
      HDC hDC2 = CreateCompatibleDC(hDC1); 
      .. 
      

      而不是

      HDC hDC = CreateCompatibleDC(GetDC()); 
      

      (顺便说一句,在您的代码中,GetDC 返回的 HDC 未释放。)

      【讨论】:

        【解决方案4】:

        我想这个问题已经回答了。我想深入并推荐可用于 GDI 对象的各种智能指针类和包装器。

        MFC 有 CDC 和 CMemoryDC 等各种 GDI 相关的对象。当不再需要它们时,它们将执行正确的删除。

        【讨论】:

          【解决方案5】:

          阅读 Petzold。 GetDC() 是真正的基础。

          【讨论】:

            【解决方案6】:

            你不应该在最后一行删除 hOldObj

            删除对象(hOldObj);

            【讨论】:

              【解决方案7】:

              我可以建议 deleaker 查找并修复漏洞。

              【讨论】:

                猜你喜欢
                • 2014-02-10
                • 2013-06-10
                • 1970-01-01
                • 2019-06-15
                • 1970-01-01
                • 2021-06-20
                • 2010-09-16
                • 1970-01-01
                • 2012-01-08
                相关资源
                最近更新 更多