2

我最近遇到了一个非常烦人的错误。当我尝试指向指向delete[]的数组fileHeader时,程序会抛出一个SIGABRT信号。

我要指定的一件事是,该程序在 Microsoft Visual C++ 2012 中使用 Microsoft C++ 编译器运行时没有任何问题,但在Code::BlocksGCC 编译器版本 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 图像文件的形式打开),因此数组的内容很好。

我真的很想知道为什么会这样,因为我发现它很奇怪......

4

1 回答 1

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++没有崩溃只是运气

于 2013-08-14T10:33:26.883 回答