Я не понимаю, почему это приводит к сбою моей программы? - PullRequest
0 голосов
/ 08 декабря 2011

Я не понимаю, почему это приводит к сбою моей программы !? когда я компилирую, он доходит до конца программы, затем перестает отвечать.

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 ]

1 голос
/ 08 декабря 2011

Вы должны объявить эту переменную перед ее использованием ...

Pixel * tempPixel = new Pixel[image.infoHeader.biWidth * image.infoHeader.biHeight];

Обратите внимание, что вы должны освободить временный массив в конце функции с помощью delete[] (в противном случае у вас есть утечка памяти),Чтобы сделать это автоматическим и избежать проблем с безопасностью исключений, вы должны использовать умный указатель, например scoped_array<Pixel> от Boost или (если у вас есть компилятор, поддерживающий новый стандарт C ++) unique_ptr<Pixel[]>.

Evenлучше: вы можете просто использовать 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, вы должны выделить больше памяти и выполнить пиксельное копирование соответственно.

0 голосов
/ 08 декабря 2011

изменить объявление массива

tempPixel[] = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)];

на

Pixel* tempPixel = new Pixel[(image.infoHeader.biWidth * image.infoHeader.biHeight)];

и не забудьте удалить его с помощью

delete[] tempPixel;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...