Почему моя программа выдает SIGABRT, когда я пытаюсь удалить массив []?

Недавно я столкнулся с очень раздражающей ошибкой. Когда я пытаюсь 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), поэтому содержимое массива хорошее.

Я действительно хочу выяснить, почему это происходит, потому что я нахожу это очень странным …

2

Решение

 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 ++

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]