最近,一直遇到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的时候要传递指针,这个一开始也没注意。