首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

图像读取程序中一个关于析够函数出错的有关问题

2012-03-13 
图像读取程序中一个关于析够函数出错的问题我在用标准C++编写一个BMP图像类,包括图像读取函数,编写完成以

图像读取程序中一个关于析够函数出错的问题
我在用标准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 函数,他们在读图像数据的时候就可能越界。

热点排行