图像读取程序中一个关于析够函数出错的问题
我在用标准C++编写一个BMP图像类,包括图像读取函数,编写完成以后发现在调用析构函数delete动态创建的数组的是时候出现运行时错误:
debug assertion failed!
file:dbgheap.c
line:1044
图像类如下:
class CBMP
{
public:
BITMAPFILEHEADER m_BMPHEADER;
BITMAPINFOHEADER m_BMPINFO;
RGBQUAD *m_quad;
char *m_cmap;
CBMP();
CBMP(const CBMP& bmp);
CBMP(char* filename);
virtual ~CBMP();
BOOL openbmp(const char* filename);
BOOL savebmp(const char* filename);
};
读取数据函数:
BOOL CBMP::openbmp(const char* filename)
{
fstream bmpin;
bmpin.open(filename,ios::in|ios::binary);
if(!bmpin)
return FALSE;
bmpin.read((char*)(&m_BMPHEADER),sizeof(m_BMPHEADER));
bmpin.read((char*)(&m_BMPINFO),sizeof(m_BMPINFO));
if(m_BMPINFO.biBitCount <=8)
{
int colornum = 1 < <m_BMPINFO.biBitCount;
m_quad=new RGBQUAD[colornum];
bmpin.read((char*)m_quad,4*colornum);
m_cmap = new char[m_BMPINFO.biWidth*m_BMPINFO.biHeight];
bmpin.read(m_cmap,m_BMPINFO.biWidth*m_BMPINFO.biHeight);
bmpin.close();
return TRUE;
}
}
析够函数:
CBMP::~CBMP()
{
if (m_quad!=NULL)
{
delete [] m_quad;
m_quad = NULL;
}
if (m_cmap=!NULL)
{
delete [] m_cmap;
m_cmap = NULL;
}
}
在调试过程中主函数只调用了一次openbmp函数,主函数运行完,到达析构函数的delete [] m_cmap语句时出错,不知道在哪产生了越界访问,只有一个bmpin.read(m_cmap,m_BMPINFO.biWidth*m_BMPINFO.biHeight)语句与m_cmap有关啊~,请高手指点!
[解决办法]
CBMP(const CBMP& bmp);是如何复制的
还有operator=这个有没有?
[解决办法]
这里感觉没有错呀,是不是其他的地方有错,导致这里出错了
[解决办法]
贴全这个类的完整代码。
[解决办法]
m_cmap = new char[m_BMPINFO.biWidth*m_BMPINFO.biHeight];
大小不够,这个宽是图像的宽度,不是数据的宽度,数据保存的时候每行都要调整到 32 位对齐。
[解决办法]
m_cmap 申请的空间大小有没有问题 ...
[解决办法]
m_BMPINFO.biWidth 是图像的像素宽度,
一个像素可能占一个 bit, 一个字节, 3 个字节等,对齐是要存储一行图像的字节数为 4 的倍数,和像素大小没关系。你直接用 m_BMPINFO.biSizeImage 才是准确的,不要去乘, bmp 位图也可以有压缩的。 如果位图一个像素占3 个字节,你乘出来的值肯定不够放图像数据的。如果你调用了显示图像之类的 API 函数,他们在读图像数据的时候就可能越界。