GDI资源的释放
2012-09-12 17:55
190 查看
上面的说法千奇百怪,网上流传的版本很多,我个人看法,都有点问题。它们之所以能流传,就是因为从效果上看不出差别。而很多人写VB程序,恰恰是只看重效果!
这个问题我没见过MSDN中有具体说明,但从其中部分函数说明与很多MFC示例中,基本可得出以下零星线索:
1、不能直接删除已选入DC中的对象,如Bmp、Brush、Pen等;
2、删除DC并不会同时删除已选入其中的对象;
3、SelectObject在选入新对象的同时会返回旧的同类对象,若程序不再需要它,应该主动删除
所以,会出现很多不同做法,常见做法,我常用的是替换法:
就是在调用SelectObject选入自己的对象时,用一个变量保存返回的旧对象;在使用完后,再一次用SelectObject选回旧对象,这样就从DC中替换出了自己的对象,这时才能用DeleteObject删除它。
具体示例:
Old = SelectObject(WinDC, CPen)
....
SelectObject WinDC, Old
DeleteObject CPen
之后若DC也不需要了,还应DeleteDC或ReleaseDC
MSDN中有的示例与上述不同
它没有选回旧对象,而是直接先DeleteDC,后DeleteObject
说实话,这些处理都是最后释放资源的问题,对GDI绘图操作并没有影响,所以从效果上看不出区别,只是若删除不正确,在XP的任务管理器中,你会看到这个程序在多次调用错误操作后,GDI句柄数一直不断增加,不见减少。
我习惯于采用替换法删除对象,实践证明这样做最为可靠,因为我在尝试MSDN示例的办法后发现,删除不能成功,GDI句柄数没有减少。
http://topic.csdn.net/u/20070509/20/ba1581fc-5f95-4873-b52a-262020b90a61.html
这个问题我没见过MSDN中有具体说明,但从其中部分函数说明与很多MFC示例中,基本可得出以下零星线索:
1、不能直接删除已选入DC中的对象,如Bmp、Brush、Pen等;
2、删除DC并不会同时删除已选入其中的对象;
3、SelectObject在选入新对象的同时会返回旧的同类对象,若程序不再需要它,应该主动删除
所以,会出现很多不同做法,常见做法,我常用的是替换法:
就是在调用SelectObject选入自己的对象时,用一个变量保存返回的旧对象;在使用完后,再一次用SelectObject选回旧对象,这样就从DC中替换出了自己的对象,这时才能用DeleteObject删除它。
具体示例:
Old = SelectObject(WinDC, CPen)
....
SelectObject WinDC, Old
DeleteObject CPen
之后若DC也不需要了,还应DeleteDC或ReleaseDC
MSDN中有的示例与上述不同
它没有选回旧对象,而是直接先DeleteDC,后DeleteObject
说实话,这些处理都是最后释放资源的问题,对GDI绘图操作并没有影响,所以从效果上看不出区别,只是若删除不正确,在XP的任务管理器中,你会看到这个程序在多次调用错误操作后,GDI句柄数一直不断增加,不见减少。
我习惯于采用替换法删除对象,实践证明这样做最为可靠,因为我在尝试MSDN示例的办法后发现,删除不能成功,GDI句柄数没有减少。
http://topic.csdn.net/u/20070509/20/ba1581fc-5f95-4873-b52a-262020b90a61.html
相关文章推荐
- 关于GDI资源使用后未释放,导致GDI对象猛增,程序花屏,异常退出的问题
- GDI资源的释放
- GDI绘图中的资源释放
- GDI资源,用完需释放
- GDI绘图中的资源释放
- 谈GDI绘图中的资源释放
- Linux下调用fork或system启动子进程的信号和资源释放相关问题
- atitit.资源释放机制--attilax总结
- C++ 动态分配资源的自动释放 – auto_ptr的实现原理
- pthread_create创建线程后必须使用join或detach释放线程资源[内存泄漏]
- SOUI假窗口释放资源后操作界面控件崩溃
- java中的可释放资源定义,类似c#中的using
- 线程的退出与其相关资源的释放
- 我深深感受到了好的习惯对编程的重要性,尤其是在需要自己释放资源的情况下
- Runtime及关闭钩子-完成退出前的清理资源释放工作
- Arc Engine二次开发资源释放问题
- 在 .net 中释放嵌入的资源
- 删除IBM常见软件进程释放系统资源
- 实现C语言自动释放资源的方法与探讨
- 从资源中加载jpg, png到GDI+ Image