【发布时间】:2021-03-04 22:23:27
【问题描述】:
当我查看 BitBlt() 示例时,我注意到几乎所有示例都为位图保存了 hdc 的默认状态,然后在清理时使用 SelectObject() 将 hdc 恢复到默认状态。包括 Windows 版 Nethack 的源代码。
除了其中一个没有这样做,只是像我一样清理 hdc 和位图。我看不出将 hdc 恢复到默认状态与内存泄漏有什么关系。仅仅删除hdc还不够吗?当您将 SelectObject() 加载到必须恢复它以清理它的位图时,hdc 是否会加载数据或其他内容?
【问题讨论】:
-
SelectObject转让所有权。在两个方向。您选择到设备上下文中的对象归设备上下文所有。从设备上下文中选择的对象的责任交给您。几十年前,这就是设备上下文的设计方式。几十年后,大量的错误代码迫使操作系统实施不虔诚的兼容性修复,这让您几乎没有明智的选择来违反合同。
标签: winapi memory-leaks gdi