delete时_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))异常
delete时_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))错误
pHead->nBlockUse的值是-17891602
我的程序是这样的:
void GLfont::ShowText(int x, int y, LPCTSTR lpszText)
{
// 保存原投影矩阵,将投影矩阵设为平行投影
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();
glOrtho( 0, 640, 0, 480, -1, 1 );
// 保存原模型变换矩阵,平移至( x, y )
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glLoadIdentity();
RECT rect;
GetClientRect(GetActiveWindow(),&rect);
glTranslatef((float)x,(float)y,0);
HBITMAP hbitmap;
BITMAP bm;
SIZE size;
HFONT hOldFont;
HDC hdc = wglGetCurrentDC();
hOldFont = (HFONT)SelectObject(hdc, hFont);
::GetTextExtentPoint32(hdc, lpszText, strlen(lpszText), &size);
hbitmap = CreateBitmap(size.cx, size.cy,1, 1, NULL);
HDC hMemDC = ::CreateCompatibleDC(hdc);
if(hMemDC)
{
HBITMAP hPrevBmp = (HBITMAP)SelectObject(hMemDC,hbitmap);
HFONT hPrevFont = (HFONT)SelectObject(hMemDC, hFont);
SetBkColor(hMemDC, RGB(0, 0, 0));
::SetTextColor(hMemDC,RGB(255,255,255));
SetBkMode(hMemDC, OPAQUE);
TextOut(hMemDC, 0, 0, lpszText, strlen(lpszText));
//把GDI位图复制到DIB
SelectObject(hdc,hbitmap);
GetObject(hbitmap, sizeof(bm), &bm);
size.cx = (bm.bmWidth + 31) & (~31);
size.cy = bm.bmHeight;
int bufsize = size.cy * (((bm.bmWidth + 31) & (~31)) /8);
pBmpBits = new GLubyte[bufsize];
memset(pBmpBits, 0, sizeof(GLubyte)*bufsize);
struct
{
BITMAPINFOHEADER bih;
RGBQUAD col[2];
}
bic;
BITMAPINFO *binf = (BITMAPINFO *)&bic;
binf->bmiHeader.biSize = sizeof(binf->bmiHeader);
binf->bmiHeader.biWidth = bm.bmWidth;
binf->bmiHeader.biHeight = bm.bmHeight;
binf->bmiHeader.biPlanes = 1;
binf->bmiHeader.biBitCount = 1;
binf->bmiHeader.biCompression = BI_RGB;
binf->bmiHeader.biSizeImage = bufsize;
binf->bmiHeader.biXPelsPerMeter = 1;
binf->bmiHeader.biYPelsPerMeter = 1;
binf->bmiHeader.biClrUsed = 0;
binf->bmiHeader.biClrImportant = 0;
::GetDIBits(hdc, hbitmap, 0, bm.bmHeight, pBmpBits, binf,DIB_RGB_COLORS);
SelectObject(hMemDC,hPrevBmp);
}
::DeleteDC(hMemDC);
SelectObject(hdc, hOldFont);
//显示文字
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glColor3f(GetRValue(cl)/255.0,GetGValue(cl)/255.0,GetBValue(cl)/255.0);
glRasterPos2i(x,y);
glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0, pBmpBits);
// 恢复投影矩阵和模型变换矩阵
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glColor3f(1.0,1.0,1.0);
}
调用这个类的代码如下:
GLfont bigFont;
bigFont.CreateFont("华文新魏",25,30,0,0,0);
glPushMatrix();
bigFont.SetTextColor(RGB(r,g,b));
bigFont.ShowText(xPos,yPos,str);
glPopMatrix();
在DISPLAY中不停的显示汉字,可是过大概5秒就会报错,我用计数器算了一下,COUNT=3311的时候,就会出现我题目中的断言
请问这是什么原因造成的啊
------解决方案--------------------
加上若干检查内存的语句 ASSERT(_CrtCheckMemory()); 重新运行一下,看是哪句代码导致内存出现越界的错误就好了。
具体到你的代码,可以将代码修改成
new GLubyte[bufsize + 1024];
试一试看是否还出现问题,如果是,就是 GetDIBits 需要的内存 bufsize 估计得不够了;如果不是,就是别的代码把内存写飞了。
pHead->nBlockUse的值是-17891602
我的程序是这样的:
void GLfont::ShowText(int x, int y, LPCTSTR lpszText)
{
// 保存原投影矩阵,将投影矩阵设为平行投影
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();
glOrtho( 0, 640, 0, 480, -1, 1 );
// 保存原模型变换矩阵,平移至( x, y )
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glLoadIdentity();
RECT rect;
GetClientRect(GetActiveWindow(),&rect);
glTranslatef((float)x,(float)y,0);
HBITMAP hbitmap;
BITMAP bm;
SIZE size;
HFONT hOldFont;
HDC hdc = wglGetCurrentDC();
hOldFont = (HFONT)SelectObject(hdc, hFont);
::GetTextExtentPoint32(hdc, lpszText, strlen(lpszText), &size);
hbitmap = CreateBitmap(size.cx, size.cy,1, 1, NULL);
HDC hMemDC = ::CreateCompatibleDC(hdc);
if(hMemDC)
{
HBITMAP hPrevBmp = (HBITMAP)SelectObject(hMemDC,hbitmap);
HFONT hPrevFont = (HFONT)SelectObject(hMemDC, hFont);
SetBkColor(hMemDC, RGB(0, 0, 0));
::SetTextColor(hMemDC,RGB(255,255,255));
SetBkMode(hMemDC, OPAQUE);
TextOut(hMemDC, 0, 0, lpszText, strlen(lpszText));
//把GDI位图复制到DIB
SelectObject(hdc,hbitmap);
GetObject(hbitmap, sizeof(bm), &bm);
size.cx = (bm.bmWidth + 31) & (~31);
size.cy = bm.bmHeight;
int bufsize = size.cy * (((bm.bmWidth + 31) & (~31)) /8);
pBmpBits = new GLubyte[bufsize];
memset(pBmpBits, 0, sizeof(GLubyte)*bufsize);
struct
{
BITMAPINFOHEADER bih;
RGBQUAD col[2];
}
bic;
BITMAPINFO *binf = (BITMAPINFO *)&bic;
binf->bmiHeader.biSize = sizeof(binf->bmiHeader);
binf->bmiHeader.biWidth = bm.bmWidth;
binf->bmiHeader.biHeight = bm.bmHeight;
binf->bmiHeader.biPlanes = 1;
binf->bmiHeader.biBitCount = 1;
binf->bmiHeader.biCompression = BI_RGB;
binf->bmiHeader.biSizeImage = bufsize;
binf->bmiHeader.biXPelsPerMeter = 1;
binf->bmiHeader.biYPelsPerMeter = 1;
binf->bmiHeader.biClrUsed = 0;
binf->bmiHeader.biClrImportant = 0;
::GetDIBits(hdc, hbitmap, 0, bm.bmHeight, pBmpBits, binf,DIB_RGB_COLORS);
SelectObject(hMemDC,hPrevBmp);
}
::DeleteDC(hMemDC);
SelectObject(hdc, hOldFont);
//显示文字
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glColor3f(GetRValue(cl)/255.0,GetGValue(cl)/255.0,GetBValue(cl)/255.0);
glRasterPos2i(x,y);
glBitmap(size.cx, size.cy, 0.0, 2.0, size.cx+2.0f, 0.0, pBmpBits);
// 恢复投影矩阵和模型变换矩阵
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glColor3f(1.0,1.0,1.0);
}
调用这个类的代码如下:
GLfont bigFont;
bigFont.CreateFont("华文新魏",25,30,0,0,0);
glPushMatrix();
bigFont.SetTextColor(RGB(r,g,b));
bigFont.ShowText(xPos,yPos,str);
glPopMatrix();
在DISPLAY中不停的显示汉字,可是过大概5秒就会报错,我用计数器算了一下,COUNT=3311的时候,就会出现我题目中的断言
请问这是什么原因造成的啊
------解决方案--------------------
加上若干检查内存的语句 ASSERT(_CrtCheckMemory()); 重新运行一下,看是哪句代码导致内存出现越界的错误就好了。
具体到你的代码,可以将代码修改成
new GLubyte[bufsize + 1024];
试一试看是否还出现问题,如果是,就是 GetDIBits 需要的内存 bufsize 估计得不够了;如果不是,就是别的代码把内存写飞了。