Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa -(void)processImage:(char*)图像---char*导致内存泄漏?_Cocoa_Image Processing_Memory Leaks - Fatal编程技术网

Cocoa -(void)processImage:(char*)图像---char*导致内存泄漏?

Cocoa -(void)processImage:(char*)图像---char*导致内存泄漏?,cocoa,image-processing,memory-leaks,Cocoa,Image Processing,Memory Leaks,在我的应用程序中,我试图处理来自网络摄像头的YUV422图像。但我有一个巨大的内存泄漏。下面你可以看到我的应用程序的简化代码示例。如果我禁用m1。。。在功能行中,没有泄漏。但是这些图像没有被处理。我试过锁、游泳池等,但没什么变化。我对可可比较陌生,所以所有这些方括号对我来说都很有趣/可怕- 使用char有问题吗?在我的旧linux+c++应用程序中没有问题。但我使用的是无符号字符*,没有线程,而且我从来没有检查过泄漏 全球: ... char m [640*480]; 主要内容: 职能1: -

在我的应用程序中,我试图处理来自网络摄像头的YUV422图像。但我有一个巨大的内存泄漏。下面你可以看到我的应用程序的简化代码示例。如果我禁用m1。。。在功能行中,没有泄漏。但是这些图像没有被处理。我试过锁、游泳池等,但没什么变化。我对可可比较陌生,所以所有这些方括号对我来说都很有趣/可怕- 使用char有问题吗?在我的旧linux+c++应用程序中没有问题。但我使用的是无符号字符*,没有线程,而且我从来没有检查过泄漏

全球:

...
char m [640*480];
主要内容:

职能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);
   }
}

一个蹩脚的回答。。。我知道。但万一你找不到更好的答案。您总是可以将函数放在C文件中,并使其成为纯C

甚至可以看看它是否能解决泄漏问题。如果不是,那么问题就出在其他地方

如果我禁用*m1。。。在功能行中,没有泄漏

不真实。那只是一项任务。要么根本没有泄漏,要么这不是泄漏的原因

您可以使用工具查找泄漏的对象,包括普通内存分配对象和Cocoa对象,并诊断泄漏

使用char*有问题吗

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

在我的旧linux+c++应用程序中没有问题。但我使用的是无符号字符*,没有线程,而且我从来没有检查过泄漏

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


您还可以尝试运行Clang静态分析器。它可以检测导致泄漏的一些代码模式。

静态分析器发现了一些问题,但没有发现泄漏;xcode v3.1的instruments v1.5仅在该线路启用时才发现巨大泄漏,但。。。。。。它说CVObject需要496b,这对我来说没有意义,因为这一行不包含任何CVObject,不管它是泄漏的Blocks>xxxxxxHistory>Category=CVObject,EventType=malloc,size=496,ResponsibleLibrary=CoreVideo,ResponsibleCaller=CVObject::alloc..long,…const,…long,…很长…谢谢你的建议…496字节不是一个“大泄漏”。尝试通过网络对象计数排序列表,然后寻找既不是可可也不是核心基础的类。谢谢你的答案。这对我帮助很大——我终于开始使用正确的工具朝着正确的方向搜索。。。net没有显示漏洞,就像我把496B误认为是巨大的漏洞一样。。但是,通过观察另一台仪器的运行情况,我注意到有一个通用的BLOCK-618496,它的净计数相对较小,但净字节却很大——在500 MB上运行1分钟后。这些实例的ResponsibleCaller是:CVPixelBufferBacking::initWithPixelBufferDescription。。。所以现在我知道我迷路了,我想我现在回到了正轨-这看起来与我当前的问题类似:请确保释放outputBuffer,如果必要,这取决于您如何获得它,您没有显示。我可能想尝试一下,但不幸的是,我必须选择cocoa,而不是返回c/c++但是。。。。。当然如果没有什么帮助,我也会试试。谢谢,所以。。。。事实证明,我不会尝试这样做,因为泄漏完全是在别处发生的。无论如何,谢谢你的时间和善意
- (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);
   }
}