Недавно я столкнулся с очень раздражающей ошибкой. Когда я пытаюсь delete[]
массив, который fileHeader
указывает на, программа бросает SIGABRT
сигнал.
Одна вещь, которую я хочу указать, состоит в том, что эта программа работает без проблем в Microsoft Visual C ++ 2012 с компилятором Microsoft C ++, но имеет эту ошибку в 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 итераций. Это повреждение массива «Array out of Bound».
Это просто удача, что не сбой с VC ++
Других решений пока нет …