Code
Code

Reputation: 81

Memory leak from Objective-C code in iOS application

My code is eating memory. I added this function and it seems to the cause of all the problems as when I dont call it then I don't run out.

It's a function in Objective-C to crop an image. How do I release the memory that was used in the auction so that at the end of the function everything is cleaned up before exiting.

-(void) crop: (CVImageBufferRef)sampleBuffer
{
    int cropX0, cropY0, cropHeight, cropWidth, outWidth, outHeight;

    cropHeight = 720;
    cropWidth = 1280;
    cropX0 = 0;
    cropY0 = 0;

    outWidth = 1280;
    outHeight = 720;

    CVPixelBufferLockBaseAddress(sampleBuffer,0);
    void *baseAddress = CVPixelBufferGetBaseAddress(sampleBuffer);
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(sampleBuffer);

    vImage_Buffer inBuff;
    inBuff.height = cropHeight;
    inBuff.width = cropWidth;
    inBuff.rowBytes = bytesPerRow;

    int startpos = cropY0*bytesPerRow+4*cropX0;
    inBuff.data = baseAddress+startpos;

    unsigned char *outImg= (unsigned char*)malloc(4*outWidth*outHeight);
    vImage_Buffer outBuff = {outImg, outHeight, outWidth, 4*outWidth};

    vImage_Error err = vImageScale_ARGB8888(&inBuff, &outBuff, NULL, 0);
    if (err != kvImageNoError)
    {
        NSLog(@" error %ld", err);
    }
    else
    {
        NSLog(@"Success");
    }


    CVPixelBufferRef pixelBuffer = NULL;
    OSStatus result = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                                   inBuff.width,
                                                   inBuff.height,
                                                   kCVPixelFormatType_32BGRA,
                                                   outImg,
                                                   bytesPerRow,
                                                   NULL,
                                                   NULL,
                                                   NULL,
                                                   &pixelBuffer);


    CVPixelBufferUnlockBaseAddress(sampleBuffer,0);

}

Upvotes: 0

Views: 171

Answers (1)

R.F.
R.F.

Reputation: 389

free(outImg); at the end missing since you are not freeing the memory allocated. It is a good practice in embedded programming and also here since you have const size pixel dimensions to use a const matrix that you can declare at the top of the function and initialized to zero.

Upvotes: 1

Related Questions