свободный () работы вызова над средством моделирования, делает iPad сердитым. удар iPad

Мое приложение исчерпывает память. Для разрешения этого я освобождаю два очень больших массива, используемые в функции, которая пишет кадровый буфер в изображение. Метод похож на это:

-(UIImage *) glToUIImage {
    NSInteger myDataLength = 768 * 1024 * 4;
    // allocate array and read pixels into it.
    GLubyte *buffer = (GLubyte *) malloc(myDataLength);
    glReadPixels(0, 0, 768, 1024, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    // gl renders "upside down" so swap top to bottom into new array.
    // there's gotta be a better way, but this works.
    GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
    for(int y = 0; y <1024; y++)
    {
            for(int x = 0; x <768 * 4; x++)
            {
                    buffer2[(1023 - y) * 768 * 4 + x] = buffer[y * 4 * 768 + x];
            }
    }

     // make data provider with data.
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL);

    // prep the ingredients
    int bitsPerComponent = 8;
    int bitsPerPixel = 32;
    int bytesPerRow = 4 * 768;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    // make the cgimage
    CGImageRef imageRef = CGImageCreate(768, 1024, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

    // then make the uiimage from that
    UIImage *myImage = [UIImage imageWithCGImage:imageRef];

    //free(buffer);
    //free(buffer2);

    return myImage;
}

Отметьте эти два, названные к свободному (буферному) и свободному (buffer2) в конце там? Они хорошо работают на средстве моделирования iPad, удаляя проблему памяти и позволяя мне генерировать с наглостью. Однако они уничтожают iPad немедленно. Как, в первый раз это выполняет его. Если я удаляю свободное () вызовы, это хорошо работает, просто исчерпывает память после минуты или два. Итак, почему является свободное () вызовом, разрушающим устройство?

Отметьте - это не вызов к свободному (), который явно разрушает устройство, это отказывает позже. Но это, кажется, первопричина/..

РЕДАКТИРОВАНИЕ - Кто-то спросил о том, где оно точно отказывает. Этот поток продолжает возвращать изображение другому объекту, который пишет это в файл. При вызове метода 'UIImageJPEGRepresentation' это генерирует сообщение EXT_BAD_ACCESS. Я предполагаю, что это вызвано тем, что UIImage, который я передаю его для записи в файл, является поврежденным, пустым или что-то еще. Но это только происходит, когда я освобождаю те два буфера.

Я понял бы, была ли память так или иначе связана с UIIMage, но это действительно не должно быть, тем более, что это работает над средством моделирования. Я задался вопросом, ли это до того, как iPad обрабатывает 'свободные' вызовы...

8
задан mtrc 23 July 2010 в 11:56
поделиться

3 ответа

Из чтения документации я полагаю, что CGDataProviderCreateWithData будет только ссылаться на память, на которую указывает buffer2, а не копировать ее. Вы должны сохранять ее выделенной до тех пор, пока изображение не будет освобождено.

Попробуйте это:

static void _glToUIImageRelease (void *info, const void *data, size_t size) {
    free(data);
}

-(UIImage *) glToUIImage {
    NSInteger myDataLength = 768 * 1024 * 4;
    // allocate array and read pixels into it.
    GLubyte *buffer = (GLubyte *) malloc(myDataLength);
    glReadPixels(0, 0, 768, 1024, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    // gl renders "upside down" so swap top to bottom into new array.
    // there's gotta be a better way, but this works.
    GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
    for(int y = 0; y 
8
ответ дан 5 December 2019 в 18:55
поделиться

Перво-наперво, вам действительно следует проверить, не удалось ли malloc вернуть NULL . Однако, если это не решит вашу проблему, используйте отладчик и пошагово просмотрите свою программу, чтобы точно увидеть, где она не работает (или, по крайней мере, получить трассировку стека). По моему опыту, странные сбои, такие как сбой где-то в неожиданных областях, почти всегда являются переполнением буфера, приводящим к повреждению произвольных данных некоторое время назад.

1
ответ дан 5 December 2019 в 18:55
поделиться

Размер буфера(ов) занижен? Посмотрите на циклы.

for(int y = 0; y <1024; y++)
{
     for(int x = 0; x <768 * 4; x++)
     {
          buffer2[(1023 - y) * 768 * 4 + x] = buffer[y * 4 * 768 + x];
     }
}

let y == 0 и x == (768*4)-1, индекс буфера2 превышает выделенный размер. Возможно, до этого индекс выходил за пределы диапазона?

0
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: