今天调试C++程序,运行了一段时间出现错误:
这是第一个错误点:
Program: D:\****\Debug\aaa.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wingdi.cpp
Line: 1113
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
第二个错误点:
Second Chance Assertion Failed: File f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wingdi.cpp, Line 1113
aaa.exe 已触发了一个断点。
然后程序就推出了。
把现场报错的图片也贴出来吧。
初步判断是程序在刷新时,由于图片或者文字等控件对象没有加载完整,该对象还是NULL时就开始了下一步处理,所以报了这样的错误。
进一步检查吧!
终于调试出了问题所在。
我在调用堆栈的窗体里发现这样一些问题,红框里时问题出现的大致位置,而绿色的两行便是我写的程序了。
仔细看看,哦,原来是以前用过的字体对象没有释放,造成了新创建的字体对象没有成功。
m_font.CreateFont(nHeight, 0, 0, 0, 550,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, L"Arial");
pFontOld = pDC->SelectObject(&m_font);
那就简单一些处理吧,先释放原来的对象了。
m_font.DeleteObject();//新添加的,解决问题。
m_font.CreateFont(nHeight, 0, 0, 0, 550,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, L"Arial");
pFontOld = pDC->SelectObject(&m_font);
经测试,问题解决。大功告成!
当然,把m_font声明成局部变量也可以,系统会自动销毁该对象。
only attach once, detach on destroy。仅使用一次,用完销毁。