CHandleMap::RemoveHandle(HANDLE h) 内断言报错

在做多线程的时候出现的错误,其实问题是出在别的地方。下面时出现的断言错误的地方

原错误代码:

//绘制绿球
if (m_Isgreenball)
{
CDC *pDC = m_greenrect.GetDC();
CBrush *poldbrush;
CBrush newbrush(RGB(0,255,0));
poldbrush=pDC->SelectObject(&newbrush);
pDC->Ellipse(greenball.pos,0,greenball.pos+greenball.rect.Height(),greenball.rect.Height());
pDC->SelectObject(poldbrush);
pDC->DeleteDC();
}

断言错误的地方:

void CHandleMap::RemoveHandle(HANDLE h)
{
// make sure the handle entry is consistent before deleting
CObject* pTemp = LookupTemporary(h);
if (pTemp != NULL)
{
// temporary objects must have correct handle values
HANDLE* ph = (HANDLE*)((BYTE*)pTemp + m_nOffset); // after CObject
ASSERT(ph[0] == h || ph[0] == NULL);
if (m_nHandles == 2)
ASSERT(ph[1] == h); // 报错定位此处
}
pTemp = LookupPermanent(h);
if (pTemp != NULL)
{
HANDLE* ph = (HANDLE*)((BYTE*)pTemp + m_nOffset); // after CObject
ASSERT(ph[0] == h);
// permanent object may have secondary handles that are different
}
// remove only from permanent map -- temporary objects are removed
// at idle in CHandleMap::DeleteTemp, always!
m_permanentMap.RemoveKey((LPVOID)h);
}
#endif

后来查书发现是句柄释放错了,多多感谢孙鑫老师。

用GetDC()得到的DC, 必须调用ReleaseDC() 
用CreateDC()创建的DC, 必须调用DeleteDC()

区别:
ReleaseDC()仅是释放对DC的引用
DeleteDC()是删除DC对象, 使用GetDC()的时候, 明显的这个DC不是我们自己创建的, 使用DeleteDC()的话就会将别人(通常是MFC框架)创建的DC干掉, 这样当别人要使用自己创建的DC时, 就会产生异常 了.
ReleaseDC()恰好解决这个问题, 它仅是释放一个引用, 告诉创建者DC, 我已经不用了.

下面是修改后的代码:

//绘制绿球
if (m_Isgreenball)
{
CDC *pDC = m_greenrect.GetDC();
CBrush *poldbrush;
CBrush newbrush(RGB(0,255,0));
poldbrush=pDC->SelectObject(&newbrush);
pDC->Ellipse(greenball.pos,0,greenball.pos+greenball.rect.Height(),greenball.rect.Height());
pDC->SelectObject(poldbrush);
ReleaseDC(pDC);
}

时间: 2024-08-29 04:35:07

CHandleMap::RemoveHandle(HANDLE h) 内断言报错的相关文章

在MacOS下Python安装lxml报错xmlversion.h not found 报错的解决方案

最近在看一个自动化测试框架的问题,需要用到Lxml库,下载lxml总是报错. 1,使用pip安装lxml pip install lxml 2,然后报错了,报错内容是: In file included from src/lxml/lxml.etree.c:139:src/lxml/etree_defs.h:9:10: fatal error: 'libxml/xmlversion.h' file not found#include "libxml/xmlversion.h" ^1 e

df -h 磁盘空间报错 但是根下只用很少空间

df -h 显示使用率非常高 Filesystem      Size  Used Avail Use% Mounted on/dev/vda1       197G  171G 16G  93% /但是 du -ssh /* 总共加起来才 31G 1.检查磁盘空间 fdiks -l 查看是否有没有挂载的磁盘 检查正常 2.检查根下是否有隐藏文件 cd /         ls -a      在查看 隐藏文件大小  发现隐藏文件没有异常的大文件 3.lsof|grep deleted    检

为什么输入shutdown -h -t会报错:command not fount

如果是直接用普通用户($)的身份进行输入[[email protected] ~]$ shutdown -h -t 是不能执行,因为普通用户没有关闭机器的权限. 然而直接使用[[email protected] ~]$ su 也是不行的.而是要使用[[email protected] ~]$ su - root : su命令和su - 命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了.只有切换了S

解决iOS应用内购买报错:invalidProductIdentifiers

当写完IAP业务过程后,点击测试却发现没有返回成功的商品Id,反而返回了无效的商品:response.invalidProductIdentifiers 这种情况下考虑以下因素: 创建的App ID是否启用了IAP功能. 商品信息是否配置到iTurn Connect,并到达“Ready to Submit”状态. 在iTurn Connect中创建Test User,并收取邮件激活.之后登录到测试用手机的设置页面中(Store选项). App的Bundle Id是否和后台配置的App Id一致.

ntp报错

今天使用虚拟你需要同步时间结果报错了.系统RHEL6.4.报错如下 # ntpdate   asia.pool.ntp.org   8 Aug 06:00:11 ntpdate[7451]: no server suitable for synchronization found 出现问题后检查防火墙是否关闭 # service iptables status iptables: Firewall is not running. 结果是关闭的 使用-d查看原因 # ntpdate -d  asi

安装nagios-plugins时候报错:./stdio.h:456:1: 错误:‘gets’未声明(不在函数内)

系统:centos7 安装nagios出现的问题. 解决办法: (1)找到报错的文件目录 (2)进入该目录: (3)编辑:sed -i -e '/gets is a security/d' ./stdio.in.h (4)回到原来的文件夹里,继续make,没有报错了. 原文地址:https://www.cnblogs.com/minsfind/p/9123513.html

PHP编译安装报错: mcrypt.h not found. Please reinstall libmcrypt.

PHP编译安装报错: mcrypt.h not found. Please reinstall libmcrypt. 转载2016-04-25 12:40:44 标签:linuxitphp 解决方法: 1.为系统安装perl-Geo-IP,默认yum源中没有这个包,特意安装epel第三方yum源[[email protected] ~] rpm -Uvh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rp

phonegap archive 报错 Cordova/CDVViewController.h' file not found

在BuildSettings->Header Search Paths  增加如下路径,问题解决 $(OBJROOT)/UninstalledProducts/include phonegap archive 报错 Cordova/CDVViewController.h' file not found

nagios报错:./stdio.h:456:1: error: 'gets' undeclared here (not in a function)

[[email protected] nagios-plugins-1.4.16]# ./configure [[email protected] nagios-plugins-1.4.16]# make  mv -f .deps/full-write.Tpo .deps/full-write.Po gcc -DHAVE_CONFIG_H -I. -I..  -I../intl   -g -O2 -MT localcharset.o -MD -MP -MF .deps/localcharset.