L
lhz
Unregistered / Unconfirmed
GUEST, unregistred user!
To茶叶蛋:
GDI的对象在某些情况下是可以自动释放的,但并不是所有情况下.
具体要什么情况不释放,我也不清除.总之,如果您大量使用GDI资源后
不释放,多运行几遍程序后,系统资源就会明显下降.即使是NT也不例
外.而内核管理的Win32对象则要好得多.
这种情况也是有其根源的.每个Win32对象的作用范围仅限于一个
进程.如果两个进程共享某个资源,其句柄在两个进程中是不一样的.而
GDI/USER对象则不同.如果进程甲创建了一个HBITMAP,那么这个句柄
可以在进程乙中使用.窗口句柄也是一样的.这样的实现方案是因为M$所
谓的C/S结构造成的.完成全部GDI/USER操作需要几个以Service方式
运行的进程合作.而这些对象从本质上来说是这些进程的局部资源.这样
就没有必要为每个进程映射不同的句柄,且还会提高效率.但这样的结果
导致跟踪句柄引用的困难.例如,一个窗口句柄HWND,在创建它的进程释
放它以后,应该从系统中删除.但某些情况下,管理它的USER进程却不知
道GDI进程是否还要引用这个句柄(对USER来说,GDI和用户进程没有差别).
这就导致了资源泄漏.
BTW:我的观点是,不管系统如何确保可以释放多少资源,也不管您能够多么肯
定某个资源只分配很少的几次,释放资源总是程序员的责任.系统的行为只是
保证程序崩溃时不会导致系统资源耗尽.
GDI的对象在某些情况下是可以自动释放的,但并不是所有情况下.
具体要什么情况不释放,我也不清除.总之,如果您大量使用GDI资源后
不释放,多运行几遍程序后,系统资源就会明显下降.即使是NT也不例
外.而内核管理的Win32对象则要好得多.
这种情况也是有其根源的.每个Win32对象的作用范围仅限于一个
进程.如果两个进程共享某个资源,其句柄在两个进程中是不一样的.而
GDI/USER对象则不同.如果进程甲创建了一个HBITMAP,那么这个句柄
可以在进程乙中使用.窗口句柄也是一样的.这样的实现方案是因为M$所
谓的C/S结构造成的.完成全部GDI/USER操作需要几个以Service方式
运行的进程合作.而这些对象从本质上来说是这些进程的局部资源.这样
就没有必要为每个进程映射不同的句柄,且还会提高效率.但这样的结果
导致跟踪句柄引用的困难.例如,一个窗口句柄HWND,在创建它的进程释
放它以后,应该从系统中删除.但某些情况下,管理它的USER进程却不知
道GDI进程是否还要引用这个句柄(对USER来说,GDI和用户进程没有差别).
这就导致了资源泄漏.
BTW:我的观点是,不管系统如何确保可以释放多少资源,也不管您能够多么肯
定某个资源只分配很少的几次,释放资源总是程序员的责任.系统的行为只是
保证程序崩溃时不会导致系统资源耗尽.