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

时间:2011-12-07 23:44:28

标签: c++ visual-c++

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

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;
}

2 个答案:

答案 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;