关于GDI内存泄漏

bokei 2000-12-10 09:16:00
什么情况下会发生GDI内存泄漏?有什么比较好的方法/经验避免?
另:VC能不能检查出GDI内存的泄漏?
...全文
436 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
whoo 2000-12-12
  • 打赏
  • 举报
回复
VC的MFC track功能 能检查出一些泄漏问题.

最好的避免方式是养成良好的编程习惯.
wjf 2000-12-12
  • 打赏
  • 举报
回复
MFC的CFont,CPen...等等的析构函数会删除栈上GDI对象.
如果直接使用HFONT,HPEN...等GDI对象,那么不过是在那分配的都要删除。

GDI对象泄漏是很严重的问题.
这一点在win98上尤为突出,如果你能得到的GDI资源是很有限的.

NUMEGA的BoundsChecker能够检测到GDI资源的泄漏...
andygood 2000-12-12
  • 打赏
  • 举报
回复

对,因为你的GDI对象的句柄是在栈中,但它对应的内存却是在堆中分配。当然,不显式删除基本也是无害的。我现在一般都显式删除。:)

bokei 2000-12-11
  • 打赏
  • 举报
回复
也就是说在声明了一个GDI对象(CFont、Cpen....)后就要显式删除了(即使是在栈上声明)?这样理解对吗?
andygood 2000-12-11
  • 打赏
  • 举报
回复

sorry,应该是“堆”而不是“堆栈”。

andygood 2000-12-11
  • 打赏
  • 举报
回复

GDI内存泄漏一般不会发生,基本只有当程序异常退出时才会发生。

Windows中,对于GDI资源,是系统自动在堆栈中分配的(当你使用诸如LoadImage之类的API调用时),系统保留有所有的句柄参考,当程序正常退出时将使用DeleteObject自动删除这些资源。

一般当你不再使用一个GDI资源时,应该显式使用DeleteObject删除它,否则它会占用一定的内存资源,直到程序结束(并且有可能造成内存泄漏)。

另外,因为在你的程序中并没有显式调用内存分配函数,所以用vc好像是不行的。另外,用Windows自带的系统资源监视器是错误或模糊的,因为它监视的是系统的GDI资源,而调试程序需要达到进程或线程的级别。

CoolBoy_007 2000-12-11
  • 打赏
  • 举报
回复
这种图形设备接口其实平时比较稳定,其原因在于其可控性非常强,如果你真认为它有泄漏,那么你可以通过在程序中频繁的GetDC,然后ReleaseDC,看看这种等价于图形设备Lock和UnLock的控制方法操作效果如何!检查嘛,就用Windows自带的系统资源监视器就足够了!
ddddh 2000-12-10
  • 打赏
  • 举报
回复
应该不能
sunkai 2000-12-10
  • 打赏
  • 举报
回复
我也想知道!!!

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧