我不明白为什么这会导致我的程序崩溃?



我不明白为什么这会导致我的程序崩溃!当我编译它时,它使它在程序结束时停止响应。

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.pixelsnew一起分配,并且将与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;

最新更新