【发布时间】:2014-02-24 18:52:07
【问题描述】:
我有一个结构定义为:
struct VImage
{
uint8_t *imageData;
int dimensions[3];
...
}
我正在分析我的代码以查找泄漏和其他问题。考虑以下代码:
for (int i = 0; i < 100; i++)
{
// after we have the image, we use the cheap rgb function to get rgb data
struct VImage *vImage = [SomeClass someFunction:someArgument];
free(vImage);
}
这会使我的代码崩溃。我想知道为什么会这样。但是,i < 10 条件不会使应用程序崩溃。对仪器进行分析并没有表明有任何泄漏;但是分配激增,我使用了大量的实时内存;所以我想知道以这种方式释放结构是否正确,或者 free 是否是一个异步函数,它将释放某人的内存,但不仅仅是在我要求它的时候。
编辑:所以我被要求提供这个someFunction 方法的详细信息,我会的。我认为该方法没有内存泄漏,但我还是把它放在这里:
+ (struct VImage *)grayScaleImageDataFromImage:(UIImage *)image
{
int imageWidth = image.size.width, imageHeight = image.size.height;
uint32_t *rgbImageData = (uint32_t *) malloc(imageWidth * imageHeight * sizeof(uint32_t));
memset(rgbImageData, 0, imageWidth * imageHeight * sizeof(uint32_t));
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// create context with RGBA pixels
CGContextRef context = CGBitmapContextCreate(rgbImageData, imageWidth, imageHeight, 8, imageWidth * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetShouldAntialias(context, NO);
// paint to fill pixels array
CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), [image CGImage]);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
// now convert to grayscale using CCIR 601 <=> Y' = 0.299 R' + 0.587 G' + 0.114 B'.
uint8_t *grayScaleImageData = (uint8_t *) malloc(imageWidth * imageHeight);
for(int y = 0; y < imageHeight; y++)
{
for(int x = 0; x < imageWidth; x++)
{
uint32_t rgbPixel = rgbImageData[y*imageWidth+x];
grayScaleImageData[y*imageWidth + x] = 0.299*((rgbPixel>>24)&255) + 0.587*((rgbPixel>>16)&255) + 0.114*((rgbPixel>>8)&255);
}
}
struct VImage *vImage = createGrayScaleDescription(grayScaleImageData, imageHeight, imageWidth);
free(rgbImageData);
return vImage;
}
struct VImage *createGrayScaleDescription(uint8_t *grayScaleImage, int height, int width)
{
struct VImage *vImage = malloc(sizeof(struct VImage));
vImage->grayScaleImage = grayScaleImage;
vImage->numberOfDimensions = 2;
vImage->dimensions[0] = height, vImage->dimensions[1] = width, vImage->dimensions[2] = 1;
vImage->isGrayscale = true;
return vImage;
}
所以我所做的就是通过一些计算使用 rgb 数据创建灰度图像。不过,我认为这里没有任何问题。
【问题讨论】:
-
这取决于
someFunction的实现。你能分享它的代码吗? -
发布
someFunction:someArgument:的代码? -
@Zaph 它与您提供的链接中的问题无关。 @Merlevede,我已经发布了
someFunction的代码。
标签: objective-c c memory-management struct profiling