什么是,为什么我在清理时必须将位图 hdc 或内存 dc 恢复到默认状态?

What is, and why do I have to restore bitmap hdc or memory dc to the default state when cleaning up?

当我查看 BitBlt() 示例时,我注意到几乎所有示例都在为位图保存 hdc 的默认状态,然后在清理时使用 SelectObject() 将 hdc 恢复到默认状态。包括 windows.

的 Nethack 源代码

除了其中一个没有这样做,只是像我一样清理 hdc 和位图。我看不出将 hdc 恢复到默认状态与内存泄漏有何关系。仅仅删除 hdc 还不够吗?当您 SelectObject() 到位图时,hdc 是否加载数据或其他东西,您必须恢复它以清理它?

除了@IInspectable 所说的,您不必恢复 DC;您只需要“un-select”您从该 DC 分配的 GDI 对象。否则,您无法删除当前 select 编辑到任何 DC.

中的对象

SelectObject() API 方便地 returns 给你一个以前 selected 的对象,所以你可以在完成后重新 select 它DC.

此外,需要澄清的是,这些问题会导致资源泄漏(非内存泄漏)。这可能更糟,因为资源的限制非常低(例如 10,000 个句柄,IIRC)。