DeleteObject(Bitmap.m_hObject)对象创佳完成以后,必须删除对象
2008-06-16 15:19
218 查看
DeleteObject之我见,真的不能删除已选入DC的GDI对象?
MSDN中关于DeleteObject函数的解释,我看过三、四个版本,都说不能删除已选入DC的GDI对象,比如MSDN2005:
Return Values
If the function succeeds, the return value is nonzero.
If the specified handle is not valid or is currently selected into a DC, the return value is zero.
Windows NT/2000/XP: To get extended error information, call GetLastError.
Remarks
Do not delete a drawing object (pen or brush) while it is still selected into a DC.
注意上面的Do not,看到真是吓人,我记得以前某个版本的MSDN写的是Should not,可是我从来都是直接删除GDI对象的,从来不关心它是否已选入DC,比如:
CDC* pDC = GetDC();
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
pDC->SelectObject(&pen);
if (pen.DeleteObject())
Beep(1500, 100); //选择MSDN,这个Beep应该不会被执行,实际是执行了
ReleaseDC(pDC);
上面的程序会Beep,说明删除是成功的;
在debug版下,没有断言错误(从源码也可以看出,它直接就调用了API-::DeleteObject);
用baundschecker查看内存,没有泄漏。
到这里,不知道你的观点是怎么样的呢?
注:我的一个曲线绘制控件,十天半个月的自动绘制实时曲线,没有发现GDI泄漏的问题,已使用几年了,
所以我才敢怀疑MSDN中的说法。
注意,我讨论的是能不能删除已选入DC的GDI对象,而不是讨论程序是否合理!
也就是说,我讨论的是是与否的问题,而非好与次的问题,所以应该不算钻牛角尖吧!
MSDN中关于DeleteObject函数的解释,我看过三、四个版本,都说不能删除已选入DC的GDI对象,比如MSDN2005:
Return Values
If the function succeeds, the return value is nonzero.
If the specified handle is not valid or is currently selected into a DC, the return value is zero.
Windows NT/2000/XP: To get extended error information, call GetLastError.
Remarks
Do not delete a drawing object (pen or brush) while it is still selected into a DC.
注意上面的Do not,看到真是吓人,我记得以前某个版本的MSDN写的是Should not,可是我从来都是直接删除GDI对象的,从来不关心它是否已选入DC,比如:
CDC* pDC = GetDC();
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
pDC->SelectObject(&pen);
if (pen.DeleteObject())
Beep(1500, 100); //选择MSDN,这个Beep应该不会被执行,实际是执行了
ReleaseDC(pDC);
上面的程序会Beep,说明删除是成功的;
在debug版下,没有断言错误(从源码也可以看出,它直接就调用了API-::DeleteObject);
用baundschecker查看内存,没有泄漏。
到这里,不知道你的观点是怎么样的呢?
注:我的一个曲线绘制控件,十天半个月的自动绘制实时曲线,没有发现GDI泄漏的问题,已使用几年了,
所以我才敢怀疑MSDN中的说法。
注意,我讨论的是能不能删除已选入DC的GDI对象,而不是讨论程序是否合理!
也就是说,我讨论的是是与否的问题,而非好与次的问题,所以应该不算钻牛角尖吧!
相关文章推荐
- DeleteObject(Bitmap.m_hObject)对象创佳完成以后,必须删除对象.
- 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader
- DeleteObject之我见,真的不能删除已选入DC的GDI对象?
- 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader
- 删除未知账户,您必须阻止对象继承权限
- 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader
- 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader
- 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样
- new出的对象数组必须要用delete[]删除,而普通数组和结构数组delete和delete[]都一样
- 还原Wss3.0内容数据库时遇到:"ComputerName\Microsoft##SSEE 上的 WSS_Content 包含用户定义的架构。数据库在能够使用之前必须为空。请删除所有表、存储过程以及其他对象,或使用其他数据库。 " 的提示,无法加载内容数据库
- new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样
- Halcon对象Hobject转换为.net对象Bitmap
- C++析构函数的自动调用(析构函数必须是虚拟的,这样删除父类指针指向的子类对象,才能同时调用两者的析构函数,否则就没有机会调用子类析构函数)
- 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader
- 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader
- 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样
- 黑马程序员_3_TreeMap是如何完成添加对象与删除对象
- HBase总结(3)--数据删除与Delete对象
- RMAN-06207: 警告: 由于状态不匹配, 所以不能删除 1 对象 (对于 DISK 通道)。 RMAN-06208: 请用 CROSSCHECK 命令修正状态
- IO流(File概述)-(File对象功能-创建和删除)-(File对象功能-判断)-(File对象功能-获取)