带有 unsigned char * 的内存泄漏
Posted
技术标签:
【中文标题】带有 unsigned char * 的内存泄漏【英文标题】:Memory leak with unsigned char * 【发布时间】:2013-04-22 09:03:39 【问题描述】:我有一个返回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)
,但没有用。如果我在我的calledMethod
方法中调用free(result)
,就不会有泄漏,但是我不能返回它。提前致谢!
编辑:
问题是,我在 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
,[NSMutableData dataWithBytes:(const void *) length:(NSUInteger)]
中的length
参数是什么,我将如何修改给定CGPoint
的数据?
【问题讨论】:
【参考方案1】:free()
是调用释放内存的正确函数。如果你仍然有内存泄漏,你要么根本没有调用free()
,要么你调用的不够多。例如,以下内容会泄漏:
myVariable = [foo calledMethod];
// some stuff
myVariable = [foo calledMethod];
// more stuff
free(myVariable);
我可以建议您使用NSMutableData,而不是使用这样的原始缓冲区。这样,您将受益于您正在使用的任何 Objective-C 内存管理方法。
【讨论】:
@Levi 长度是你想要的 NSMutableData 中的字节数。这与您调用的字节数相同。即size * 4 * sizeof(unsigned char)
(无符号字符的大小为1,因此您可以使用size * 4
)【参考方案2】:
你所做的是正确的。您返回分配给 myVariable
的 malloc 内存块,然后使用 free(myVariable)
释放它。您向我们展示的代码不对泄漏负责。也许它位于...
?。静态分析告诉你什么?
【讨论】:
没试过静态分析。只在仪器中检查过【参考方案3】:完成后调用free
将释放内存。当您尝试调用free(myVariable)
时,您确定您正确地检测了事物吗?应该可以的。
【讨论】:
是的,每次我调用该方法时,总分配量都会增加 6 MB。如果我释放calledMethod
中的内存,一切看起来都很好。
@Levi 但是你真的有内存泄漏吗?
@Sulthan 我“离开”了该方法,不再引用该数据,但仪器仍指示分配的内存。
@Levi 好吧,这并不意味着它是泄漏。如果内存在同一方法中被释放,编译器可以创建一些巧妙的优化并在第二次调用该方法时重用该内存。释放内存并不意味着它会立即返回系统。使用“泄漏分析仪”仪器检测泄漏。分配的内存增加并不意味着泄漏。
@Sulthan 确实,泄漏分析器没有显示任何泄漏。但是,当我在设备上运行应用程序(只是为了使用更小的内存)并继续调用该方法时,我最终会收到内存警告和崩溃(该方法的调用是在用户交互中)以上是关于带有 unsigned char * 的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有 unsigned char* 的结构从 C# 传递到 C++?
使用“unsigned char”指向原始数据缓冲区时需要了解内存管理