内存泄漏与unsigned char *

时间:2013-04-22 09:03:40

标签: ios objective-c

我有一个方法可以返回unsigned char *

- (unsigned char *)calledMethod {
    ...
    unsigned char *result = (unsigned char*) calloc(size * 4, sizeof(unsigned char));
    ...
    return result;
}

问题在于,当我调用此方法时:

unsigned char *myVariable = [myClass calledMethod];

我得到内存泄漏。

我应该如何释放记忆?

我已经尝试了free(myVariable),但没有用。如果我在我的free(result)方法中调用calledMethod,则不会有泄漏,但我无法返回。提前谢谢!

修改

问题是,我在myVariable存储UIImage的像素数据(每个CGPoint:rgba的4个组件)。我必须修改一些像素并重建图像。我正在访问这样一个点的数据:

int byteIndex = (bytesPerRow * point.y) + point.x * bytesPerPixel;
CGFloat red   = (myVariable[byteIndex]     * 1.0) / 255.0;
CGFloat green = (myVariable[byteIndex + 1] * 1.0) / 255.0;
CGFloat blue  = (myVariable[byteIndex + 2] * 1.0) / 255.0;
CGFloat alpha = (myVariable[byteIndex + 3] * 1.0) / 255.0;

如果我使用NSMutableData,那么length中的[NSMutableData dataWithBytes:(const void *) length:(NSUInteger)]参数会是什么?如何修改给定CGPoint的数据?

3 个答案:

答案 0 :(得分:6)

free()是调用以释放内存的正确函数。如果你仍然有内存泄漏,你要么根本不打电话给free(),要么你没有打电话给它。例如,以下内容会泄漏:

myVariable = [foo calledMethod];
// some stuff
myVariable = [foo calledMethod];
// more stuff
free(myVariable);

我可能会建议您使用NSMutableData而不是像这样使用原始缓冲区。这样,您将获得正在使用的任何Objective-C内存管理方法的好处。

答案 1 :(得分:2)

你在做什么是正确的。您将返回一个malloc-ed内存块,并将其分配给myVariable,然后使用free(myVariable)释放它。您向我们展示的代码不对泄漏负责。也许它位于...?静态分析告诉你什么?

答案 2 :(得分:1)

完成后调用free将释放内存。当您尝试拨打free(myVariable)时,您确定自己正确地检测了一些内容吗?这应该有用。