业余编程爱好者向专家求援

newqed 2018-12-02 11:36:49
用Visual Studio 2012 编了一个字符串显示函数。程序运行时在调用此函数上千次之后会出现错误:
线程 0x1ca0 已退出,返回值为 0 (0x0)。
线程 0x2598 已退出,返回值为 0 (0x0)。
0x0011E26C 处的第一机会异常(在 ksd.exe 中): 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
调试显示问题出在 语句 CFont* pFont=pDC->SelectObject(&font); 这里。
艰苦奋斗几小时解决不了。
恳请专家指教!
CSDN 的新人第一次发帖,请多多包涵。

void CksdView::ShowCString(int index,int irow, int icol, CString string, CString colour)
{
/* 显示一个已知数
index, 盘号,0,1,2.
irow,icol 行和列
string,
colour, 颜色。 可选项:blue(隐含), red.
例: colour=“blue” ; // 或者 colour=“red”
ShowNumber(index,irow,icol,str,colour);
*/

CString str;
int ix,iy,k;
int ired,igreen,iblue;

ired=0;
igreen=0;
iblue=255; // 隐含色是蓝色
if (colour=="red")
{ ired = 255;
igreen=0;
iblue=0; }
// strin=string;
ix = rsize*( 200+index1080+90icol-90);
iy = rsize*( 200+92*irow-92);

CDC *pDC=GetDC();// device context for painting
CFont font; //创建字体对象
font.CreateFont(60,0,0,0,FW_MEDIUM,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,"Arial");
CFont* pFont=pDC->SelectObject(&font);
CFont *pOldFont=pDC->SelectObject(&font);//选入设备描述表
pDC->SelectObject(&font); //选入设备环境
pDC->SetTextColor(RGB(ired,igreen,iblue)); //设置文本颜色
pDC->TextOut(ix,iy,string); // 输出 !!!


font.DeleteObject();
// pDC->SelectStockObject(DEVICE_DEFAULT_FONT);//选择堆字体 // test add

}
...全文
341 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sichuanwww 2019-04-20
  • 打赏
  • 举报
回复
从void CksdView::ShowCString可以看出,这是某个类的成员函数,
这样,某些耗费资源的就可以设置成类成员,比如CFont* pFont,CDC *pDC
这些只在适当位置初始化一次,反复使用,不用每次都新建,程序结束的时候释放,可以加快效率,减少资源管理的难度。
牧童吃五谷 2019-04-20
  • 打赏
  • 举报
回复
GetDC()一定要对应一条ReleaseDC(...)语句
Eleven 2018-12-03
  • 打赏
  • 举报
回复
0x0011E26C 处的第一机会异常(在 ksd.exe 中): 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
调试显示问题出在 语句 CFont* pFont=pDC->SelectObject(&font); 这里。
------------------------
应该是pDC的指针为NULL了。
赵4老师 2018-12-03
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

搜“GDI泄露检测”
schlafenhamster 2018-12-03
  • 打赏
  • 举报
回复
CFont* pFont=pDC->SelectObject(&font);
CFont *pOldFont=pDC->SelectObject(&font);//选入设备描述表
pDC->SelectObject(&font); //选入设备环境
红的不要 !
zgl7903 2018-12-02
  • 打赏
  • 举报
回复
应该是资源死锁导致GDI资源泄漏

CDC *pDC=GetDC();// device context for painting
CFont font; //创建字体对象
font.CreateFont(60,0,0,0,FW_MEDIUM,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,"Arial");
CFont *pOldFont=pDC->SelectObject(&font);//选入设备描述表
pDC->SelectObject(&font); //选入设备环境
pDC->SetTextColor(RGB(ired,igreen,iblue)); //设置文本颜色
pDC->TextOut(ix,iy,string); // 输出 !!!

pDC->SelectObject(pOldFont); //恢复字体
ReleaseDC(); //释放DC

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧