简体   繁体   中英

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);

}

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM