Иногда я получаю EXEC_BAD_ACCESS (нарушение прав доступа) при обращении массива
Я загружаю изображение с помощью библиотеки OpenEXR.
Это прекрасно работает, за исключением того, что изображение загружается повернутым на 180 градусов. Я использую цикл, показанный ниже, чтобы обратить массив, но иногда программа завершает работу, и xcode выдаст мне ошибку EXEC_BAD_ACCESS (которая, как я полагаю, аналогична нарушению прав доступа в msvc). Это происходит не каждый раз, а раз в 5-10 раз.
В идеале я бы хотел перевернуть массив на месте, хотя это приводило к ошибкам каждый раз, и использование memcpy не помогло бы, но без ошибки, просто пустое изображение. Я хотел бы знать, что вызывает эту проблему в первую очередь.
Вот код, который я использую: (Rgba - это структура из 4 "Half"s r, 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 ответа
А вот как вы можете оптимизировать этот код для экономии памяти и для циклов:
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* в качестве параметра и его распределение. Хорошей практикой является выделение и освобождение памяти в одном и том же фрагменте кода.
Изменить:
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!)