eVC assert failed调试方法

15 篇文章 0 订阅
最近,一直遇到assert failed错误,这个要在debug下才会有,根据弹出的对话框可以找到相应的源文件,找到对应的assert,比如我的是wingdi.cpp,line1194
BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
	ASSERT(m_hObject == NULL);      // only attach once, detach on destroy
	if (hObject == NULL)
		return FALSE;
	CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist
	ASSERT(pMap != NULL);
	pMap->SetPermanent(m_hObject = hObject, this);
	return TRUE;
}

第一个assert即是1194行。

找到问题所在,可以在此处设一断点,然后出现错误时,通过查看堆栈定位问题源头。

一开始有一个原因,这个不具代表性,见:

http://topic.csdn.net/u/20121001/23/bda454b2-7997-4fbe-b888-047cd69077be.html?seed=2025379092&r=79807886#r_79807886

后来,又遇到一个原因是CFont的,create Font之后,没有删除,而且是在OnPaint中创建的,所以,窗口重绘是,又会调用创建,而创建Font又会调用上面的Attach(这个可以借助call stack看清楚,这个函数是被谁调用的,call stack在memory上右键即可调出),而第一个assert认为第一次应该是NULL,而我没有删除Font,所以不是NULL,所以出现assert failed。

其实这个归根到底,是自己操作不规范,想偷懒,创建了就不管了,而且DC选择Font完后,要从DC中选择出,即选择原来的Font。DC选择出,Font删除,在MSDN中清楚的写着,自己偷懒,所以导致调试的这么费劲!!!

When you finish with the CFont object created by the CreatePointFont method, first select the font out of the device context, then delete theCFont object.

m_FontB.CreatePointFont(250, _T("Arial"), NULL);
。。。
CFont *def_font = dc.SelectObject(&m_FontM);
。。。
dc.SelectObject(def_font);
另外select的时候要传递指针,这个一开始也没注意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值