当我尝试删除[]数组时,为什么我的程序会抛出SIGABRT?

萨鲁·米海(SaruMihai)

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

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

我真的很想知道为什么会这样,因为我觉得这很奇怪。

姆什里夫
 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么当我尝试解开可选项时,我的 Swift 应用程序会抛出致命错误?

当我尝试从自定义数组中删除元素时,为什么Java会向我显示“越界”异常?

当我尝试创建计数器时,为什么 thinkscript 会抛出这些问题?

当我尝试使用 Firebase 注销用户时,为什么 Redux 会抛出空错误?

当我尝试在结构数组中提供值时,为什么我的程序停止了?

当我尝试发送2D整数数组时,为什么MPI_Send会阻塞?

为什么当我尝试显示我的 ip usig Inet 时我的应用程序崩溃?

为什么当我的IDE没有时,javac会抛出编译错误?

当我从 C# 代码调用导入的 C++ 函数时,为什么会抛出 AccessViolationException?

熊猫为什么会抛出“数据重叠”。当我使用pd.update时?

为什么当我点击登录按钮时我的程序会冻结

当我单击链接时,为什么我的react / webpack应用程序会刷新?

为什么当我点击项目时我的应用程序会强制关闭?

当我尝试打印封面数组时,为什么我的输出为空?

java:为什么当我尝试重新启动线程时我的应用程序崩溃了?

当我尝试添加ArrayList元素时,即使它是新的,为什么我的程序仍然存在?

当我尝试从源代码构建程序时,为什么“ make”会抱怨缺少规则?

当我尝试呈现此 .NET 视图时,为什么会获得此“InvalidOperationException”?

当我告诉Gradle运行Java 14时,为什么Gradle会尝试使用Java 8?

当我尝试拟合线性混合效应模型时,为什么statsmodels会引发IndedxError?

当我尝试并行拟合多个模型时,为什么tensorflow / keras会阻塞?

当我尝试转换为int时,ruby为什么会引发错误?

当我尝试从Firebase检索数据库信息时,SwiftUI为什么会显示错误?

当我将项目添加到 FirebaseDatabase 时,为什么我的布尔值会抛出空指针异常?

当我增加一个指针然后删除它时,为什么我的程序崩溃?

当我尝试从 SQLite 数据库中删除一行时,为什么我的 android 应用程序崩溃?科特林

删除数组指针时我的程序不返回 0

当我的输入有效时,为什么删除“self”会导致错误?

为什么我的程序会抛出此JNI错误?