- (void)processImage:(char *)image; --- char *导致内存泄漏?

时间:2009-08-26 12:21:47

标签: cocoa image-processing memory-leaks

在我的应用程序中,我正在尝试从网络摄像头处理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);
   }
}

2 个答案:

答案 0 :(得分:0)

  

如果我在功能中禁用“*(m1 ...”行,则没有泄漏。

不真实的。那只是一个任务。无论如何都没有泄漏,或者这不是泄漏的原因。

您可以使用Instruments查找泄漏的对象(普通内存分配和Cocoa对象),并诊断泄漏。

  

使用“char *”是一个问题吗?

没有。类型不会导致泄漏。内存管理不正确会导致泄漏。

  

在我的旧linux + c ++应用程序中没有问题。但是我使用的是“unsigned char *”,没有线程,而且我从未检查过泄漏......

在添加线程或添加Cocoa代码时,您可能会引入泄漏。同样可能的是,泄漏始终存在,而您以前从未见过它。只有当您发现仪器或其他工具的问题时,您才能确定。

您也可以尝试运行Clang Static Analyzer。它可以检测一些导致泄漏的代码模式,等等。

答案 1 :(得分:-1)

蹩脚的答案......我知道。但万一没有更好的答案。您始终可以将该函数放在C文件中,并将其设置为c。

甚至可能很高兴看到它是否解决了泄漏问题。如果没有,则问题出在其他地方。