用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
}
uj5u.com熱心網友回復:
應該是資源死鎖導致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
uj5u.com熱心網友回復:
CFont* pFont=pDC->SelectObject(&font);CFont *pOldFont=pDC->SelectObject(&font);//選入設備描述表
pDC->SelectObject(&font); //選入設備環境
紅的不要 !
uj5u.com熱心網友回復:
崩潰的時候在彈出的對話框按相應按鈕進入除錯,按Alt+7鍵查看Call Stack即“呼叫堆疊”里面從上到下列出的對應從里層到外層的函式呼叫歷史。雙擊某一行可將游標定位到此次呼叫的源代碼或匯編指令處,看不懂時雙擊下一行,直到能看懂為止。搜“GDI泄露檢測”
uj5u.com熱心網友回復:
0x0011E26C 處的第一機會例外(在 ksd.exe 中): 0xC0000005: 讀取位置 0x00000000 時發生訪問沖突。除錯顯示問題出在 陳述句 CFont* pFont=pDC->SelectObject(&font); 這里。
------------------------
應該是pDC的指標為NULL了。
uj5u.com熱心網友回復:
GetDC()一定要對應一條ReleaseDC(...)陳述句uj5u.com熱心網友回復:
從void CksdView::ShowCString可以看出,這是某個類的成員函式,這樣,某些耗費資源的就可以設定成類成員,比如CFont* pFont,CDC *pDC
這些只在適當位置初始化一次,反復使用,不用每次都新建,程式結束的時候釋放,可以加快效率,減少資源管理的難度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/50112.html
標籤:進程/線程/DLL
