在打开位图的操作函数中,调用delete函数将指向位图指针释放,系统报错
if (m_pDib!=NULL)
{
delete[] m_pDib;
m_pDib = NULL;
}
上面的代码中m_pDib是一个指向DIB位图的指针,语句是要判断位图是否存在,如果存在则释放指针,将m_pDib重新指向一个位图;
下面是整体的打开一个位图的代码:
CFileDialog dlg(TRUE,"*.BMP",NULL,NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");
CString strfilepath;
CFile file;
if(IDOK==dlg.DoModal())
{
strfilepath=dlg.GetPathName();
if (!file.Open(strfilepath,CFile::modeRead))
return; BITMAPFILEHEADER btfileheader;//定义位图文件头 m_dFileLength = file.GetLength();// 获得文件的长度(逻辑)
m_dDibSize = m_dFileLength-sizeof(BITMAPFILEHEADER);//得到DIB文件长度

//判断DIB指针是否为空,若不为空,则删除原来的位图,并将指针指向空
if (m_pDib!=NULL)
{
delete[] m_pDib;
m_pDib = NULL;
}
m_pDib = new unsigned char[m_dDibSize];//重新分配DIB图像内存 if (file.Read((LPSTR)&btfileheader,sizeof(btfileheader))!=sizeof(btfileheader))//读取文件头
return;
if(btfileheader.bfType!=(WORD)('M'<<8 | 'B'))//判断是否为BMP图像
return; if(file.Read(m_pDib,m_dDibSize)!=m_dDibSize)//读取文件头以后的DIB文件
return;

m_btInfoHeader = (BITMAPINFOHEADER*)m_pDib;//获得信息头
m_lHeigth = m_btInfoHeader->biHeight;//图像高度
m_lWidth = m_btInfoHeader->biWidth;//图像宽度
m_wBitCount = m_btInfoHeader->biBitCount;//图像像素的位数 switch (m_wBitCount)
{
case 1:
m_iNumColor = 2;//单色DIB有2个表项
break;
case 4:
m_iNumColor = 16;//16色DIB最多有16个表项
break;
case 8:
m_iNumColor = 256;//256色DIB最多有256个表项
break;
case 24:
m_iNumColor = 0;//真彩色DIB没有调色板
break;
default:
return;
} m_pDibBits = m_pDib + sizeof(BITMAPINFOHEADER)+m_iNumColor*sizeof(RGBQUAD);
ShowBMP(); }