Иногда я получаю EXEC_BAD_ACCESS (нарушение прав доступа) при обращении массива - PullRequest
2 голосов
/ 25 июля 2010

Я загружаю изображение с помощью библиотеки OpenEXR.

Это работает нормально, за исключением того, что изображение загружено повернутым на 180 градусов.Я использую цикл, показанный ниже, чтобы инвертировать массив, но иногда программа закроется, и xcode выдаст мне ошибку EXEC_BAD_ACCESS (которая, как я полагаю, аналогична нарушению прав доступа в msvc).Это не происходит каждый раз, только один раз каждые 5-10 раз.

В идеале я хотел бы обратить вспять массив на месте, хотя это приводило к ошибкам каждый раз, и использование memcpy завершилось бы неудачей, но без возникновения ошибки, простопустое изображение.Я хотел бы знать, что в первую очередь вызывает эту проблему.

Вот код, который я использую: (Rgba - это структура из 4 "Half" sr, g, b и a, определенных в OpenEXR)

Rgba* readRgba(const char filename[], int& width, int& height){
    Rgba* pixelBuffer = new Rgba[width * height];
    Rgba* temp = new Rgba[width * height];

    // ....EXR Loading code....

    // TODO: *Sometimes* the following code results in a bad memory access error. No idea why.
    // Flip the image to conform with OpenGL coordinates.
    for (int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
            temp[(i*width)+j] = pixelBuffer[(width*height)-(i*width)+j];
        }
    }

        delete pixelBuffer;

        return temp;
}

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 25 июля 2010

Изменение:

        temp[(i*width)+j] = pixelBuffer[(width*height)-(i*width)+j];

на:

        temp[(i*width)+j] = pixelBuffer[(width*height)-(i*width)+j - 1];

(Подсказка: подумайте, что происходит, когда i = 0 и j = 0!)

1 голос
/ 25 июля 2010

А вот как вы можете оптимизировать этот код для экономии памяти и для циклов:

 Rgba* readRgba(const char filename[], int& width, int& height)
 {
    Rgba* pixelBuffer = new Rgba[width * height];
    Rgba tempPixel;

    // ....EXR Loading code....

    // Flip the image to conform with OpenGL coordinates.
    for (int i = 0; i <= height/2; i++)
      for(int j = 0; j < width && (i*width + j) <= (height*width/2); j++)
      {
        tempPixel =  pixelBuffer[i*width + j];
        pixelBuffer[i*width + j] = pixelBuffer[height*width - (i*width + j) -1];
        pixelBuffer[height*width - (i*width + j) -1] = tempPixel;
      }

    return pixelBuffer;
 }

Обратите внимание, что оптимальным (с точки зрения наилучшей практики использования памяти) было бы передать pixelBuffer * в качестве параметра и уже выделить. Хорошей практикой является выделение и освобождение памяти в одном и том же фрагменте кода.

...