在我的应用程序中,我正在尝试从网络摄像头处理YUV422图像。但我得到了巨大的内存泄漏。下面你可以看到我的应用程序的简化代码示例。如果我在函数中禁用“(m1 ...”行,则没有泄漏。(但图像未被处理)。我尝试过锁,池等,但没有任何改变。我是可可比较新,所以所有这些方括号对我来说都很有趣/可怕;-)
使用“char ”是一个问题吗?在我的旧linux + c ++应用程序中没有问题。但是我使用的是“unsigned char *”,没有线程,而且我从未检查过泄漏......
全局:
...
char m [640*480];
“主”:
...
[NSThread detachNewThreadSelector:@selector(processOutputBuffer) toTarget:self withObject:nil];
...
功能1:
- (void)processOutputBuffer {
[NSThread setThreadPriority:0.4];
[lock lock];
...
Ptr outputBufferBaseAddress = (Ptr)CVPixelBufferGetBaseAddress(outputBuffer);
CVPixelBufferLockBaseAddress(outputBuffer, 0);
[self yuv422_to_y8uv8:outputBufferBaseAddress m1:m];
...
}
函数2:
- (void) yuv422_to_y8uv8:(char *)image m1:(char *)m1 {
int x,y;
for (y = 0; y < 480; y++)
for (x = 0; x < 640; x++)
{
*(m1 + (640 * y) + (x))=*(image + (640*2 * y) + (x*2)+1);
}
}
答案 0 :(得分:0)
如果我在功能中禁用“*(m1 ...”行,则没有泄漏。
不真实的。那只是一个任务。无论如何都没有泄漏,或者这不是泄漏的原因。
您可以使用Instruments查找泄漏的对象(普通内存分配和Cocoa对象),并诊断泄漏。
使用“char *”是一个问题吗?
没有。类型不会导致泄漏。内存管理不正确会导致泄漏。
在我的旧linux + c ++应用程序中没有问题。但是我使用的是“unsigned char *”,没有线程,而且我从未检查过泄漏......
在添加线程或添加Cocoa代码时,您可能会引入泄漏。同样可能的是,泄漏始终存在,而您以前从未见过它。只有当您发现仪器或其他工具的问题时,您才能确定。
您也可以尝试运行Clang Static Analyzer。它可以检测一些导致泄漏的代码模式,等等。
答案 1 :(得分:-1)
蹩脚的答案......我知道。但万一没有更好的答案。您始终可以将该函数放在C文件中,并将其设置为c。
甚至可能很高兴看到它是否解决了泄漏问题。如果没有,则问题出在其他地方。