我最近遇到了一个非常烦人的错误。当我尝试指向delete[]
的数组时,fileHeader
程序将抛出一个SIGABRT
信号。
我要指定的一件事是,该程序在使用Microsoft C ++编译器的Microsoft Visual C ++ 2012中运行时没有任何问题,但是在Code::Blocks
GCC编译器4.6版中存在此错误。
以下是与此错误相关的代码:
void Image::saveBMP(char fileName[])
{
ofstream file(fileName, ios::binary);
if(file.is_open())
{
char *fileHeader = setupFileHeader();
char *imageHeader = setupImageHeader();
char *imageData = setupImageData();
file.write(fileHeader, 14);
file.write(imageHeader, 40);
file.write(imageData, height*width*4);
delete[] fileHeader;
delete[] imageHeader;
delete[] imageData;
file.close();
}
}
char* Image::setupFileHeader()
{
char *buffer = new char[14];
unsigned fileSize = (unsigned)(width*height*4 + 54);
for(int i = 0;i < 40;i++)
buffer[i] = 0;
buffer[0] = 'B';
buffer[1] = 'M';
buffer[10] = 54;
for(int i = 0;i < 4;i++)
{
buffer[2+i] = (fileSize >> (i*8)) & 0xFF;
}
return buffer;
}
char* Image::setupImageHeader()
{
char *buffer = new char[40];
unsigned rawDataSize = (unsigned)(width*height*4);
unsigned resolution = 2835; //pixels per meter
for(int i = 0;i < 40;i++)
buffer[i] = 0;
buffer[0] = 40;
buffer[12] = 1;
buffer[14] = bpp;
for(int i = 0;i < 4;i++)
{
buffer[4+i] = (width >> (i*8)) & 0xFF;
buffer[8+i] = (-1*height >> (i*8)) & 0xFF;
buffer[20+i] = (rawDataSize >> (i*8)) & 0xFF;
buffer[24+i] = (resolution >> (i*8)) & 0xFF;
buffer[38+i] = (resolution >> (i*8)) & 0xFF;
}
return buffer;
}
char* Image::setupImageData()
{
unsigned rawDataSize = (unsigned)(width*height*4);
char *buffer = new char[rawDataSize];
int k = 0;
for(int i = 0;i < height;i++)
for(int j = 0;j < width;j++)
{
buffer[k++] = pixels[i][j].getBlueByte();
buffer[k++] = pixels[i][j].getGreenByte();
buffer[k++] = pixels[i][j].getRedByte();
}
return buffer;
}
我已经检查过了,而当delete[]
要执行此操作时,它fileHeader
正确地指向了应该删除的数组。并且文件已创建并且具有正确的格式(作为BMP图像文件打开),因此阵列的内容很好。
我真的很想知道为什么会这样,因为我觉得这很奇怪。
char *buffer = new char[14];
unsigned fileSize = (unsigned)(width*height*4 + 54);
for(int i = 0;i < 40;i++)
buffer[i] = 0;
在这里,您正在分配14个字符的缓冲区。在循环中,您要为40个迭代填充缓冲区。这是“数组越界”内存损坏。
幸运的是,VC ++并没有使它崩溃
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句