我不明白为什么这会导致我的程序崩溃!当我编译它时,它使它在程序结束时停止响应。
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;
}
你必须在使用这个变量之前声明它…
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);
,让它处理分配/释放。
先发制人的答案纠正(由于你的新问题):如果最终你要将tempPixel
分配给image.pixels
,那么你不能将delete[]
tempPixel
,否则image
将被一个指向释放内存的指针所取代。
但是你有更大的问题:当你替换image.pixels
时,你并没有释放它之前指向的内存。所以你应该释放的内存,然后分配tempPixel
给它。
所有这些都假设image.pixels
与new
一起分配,并且将与delete[]
一起释放(否则您会得到分配函数/操作符的不匹配)。
顺便说一下,如果你的图像只是某种包装的Windows DIB (BMP),因为它似乎从头字段名称你没有考虑到像素线是4字节对齐的事实(所以,如果你的图像不是32bpp,你必须分配更多的内存和执行像素复制相应)。
改变数组声明
tempPixel[] = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)];
Pixel* tempPixel = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)];
,记得用
删除它delete[] tempPixel;