Утечка памяти при загрузке изображения в текстуру с помощью CVOpenGLESTextureCacheCreateTextureFromImage
Я отладил с помощью инструментов, но я не могу найти его:
CVPixelBufferRef pixelBuffer;
CVReturn err = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, IMAGE_WIDTH, IMAGE_HEIGHT, kCVPixelFormatType_32BGRA, _outputFrame.data, 4 * IMAGE_WIDTH, dataReleaseCallback, NULL, NULL, &pixelBuffer);
if(!pixelBuffer || err) {
NSLog(@"CVPixelBufferCreateWithBytes failed (error: %d)", err);
return;
}
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _backgroundTextureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RGBA, IMAGE_WIDTH, IMAGE_HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0, &_backgroundTextureRef);
_backgroundTexture = CVOpenGLESTextureGetName(_backgroundTextureRef);
[_frameLock unlock];
glBindTexture(GL_TEXTURE_2D, _backgroundTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Затем в методе рисования OpenGL после вызова рисования:
...
CFRelease(_backgroundTextureRef);
_backgroundTextureRef = NULL;
CVOpenGLESTextureCacheFlush(_backgroundTextureCache, 0);
Я попытался освободить буфер пикселей вручную, но затем он не работает в обратном вызове dataReleaseCallback
из CVOpenGLESTextureCacheCreateTextureFromImage
с EXC_BAD_ACCESS
, Я не знаю, что еще могло там протекать.
ОБНОВЛЕНИЕ:
Я закомментировал тело обратного вызова:
inline void dataReleaseCallback(void *releaseRefCon, const void *baseAddress)
{
// free((void *)baseAddress);
}
И теперь я могу позвонить:
CVPixelBufferRelease(_pixelBuffer);
без каких-либо ошибок и утечка памяти исправлена. Возникает вопрос: какая польза от этого обратного вызова?