我不明白为什么这会导致我的程序崩溃!?当我编译它使它然后结束程序然后停止响应。
void rotate90(Image& image)
{
Pixel * tempPixel = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)];
for(int r = 0; r < image.infoHeader.biHeight; r ++)
{
for(int c = 0; c < image.infoHeader.biWidth; c++)
{
int f = c+(r*image.infoHeader.biWidth);
int t = (image.infoHeader.biHeight - r - 1) + (image.infoHeader.biWidth-c-1);
tempPixel[t] = image.pixels[f];
}
}
image.pixels =tempPixel ;
delete[] tempPixel;
}
答案 0 :(得分:1)
你必须在使用它之前声明该变量......
Pixel * tempPixel = new Pixel[image.infoHeader.biWidth * image.infoHeader.biHeight];
请注意,必须使用delete[]
在函数末尾释放临时数组(否则会导致内存泄漏)。为了使其自动化并避免异常安全问题,您应该使用智能指针,如Boost中的scoped_array<Pixel>
或(如果您有支持新C ++标准的编译器)unique_ptr<Pixel[]>
。
更好:你可以使用std::vector<Pixel>
std::vector<Pixel> tempPixel(image.infoHeader.biWidth * image.infoHeader.biHeight);
让它处理分配/解除分配。
抢先式答案更正(由于您的new question):如果您最终要将tempPixel
分配给image.pixels
,那么您不能delete[]
{{1否则tempPixel
将替换为指向释放内存的指针。
但是你有更大的问题:当你替换image
时,你并没有释放它之前指向的内存。因此,您应该释放那个内存,然后将image.pixels
分配给它。
所有这一切都假设tempPixel
分配了image.pixels
并且将被new
取消分配(否则会导致分配函数/运算符不匹配)。
顺便说一句,如果你的图像只是某种Windows DIB(BMP)包装器,就像从头字段名称看来的那样,你没有考虑到像素行是4字节对齐的事实(所以,如果您的图像不是32bpp,则必须分配更多内存并相应地执行像素复制。)
答案 1 :(得分:0)
更改数组声明
tempPixel[] = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)];
到
Pixel* tempPixel = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)];
并记得用
删除它delete[] tempPixel;