用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}

解决方案 »

  1.   

    应该是资源死锁导致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
      

  2.   

    CFont* pFont=pDC->SelectObject(&font);
    CFont *pOldFont=pDC->SelectObject(&font);//选入设备描述表
    pDC->SelectObject(&font);       //选入设备环境
    红的不要 !
      

  3.   

    崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。搜“GDI泄露检测”
      

  4.   

    0x0011E26C 处的第一机会异常(在 ksd.exe 中): 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
    调试显示问题出在 语句 CFont* pFont=pDC->SelectObject(&font); 这里。
    ------------------------
    应该是pDC的指针为NULL了。
      

  5.   

    GetDC()一定要对应一条ReleaseDC(...)语句
      

  6.   

    从void CksdView::ShowCString可以看出,这是某个类的成员函数,
    这样,某些耗费资源的就可以设置成类成员,比如CFont* pFont,CDC *pDC
    这些只在适当位置初始化一次,反复使用,不用每次都新建,程序结束的时候释放,可以加快效率,减少资源管理的难度。