gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:10 25 4
gpt4 key购买 nike

最近我遇到了一个非常烦人的错误。当我尝试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++没死机就是运气

关于c++ - 为什么当我尝试删除 [] 数组时我的程序会抛出 SIGABRT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18229273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com