2009-08-26 4 views
0

내 앱에서 웹캠에서 YUV422 이미지를 처리하려고합니다. 하지만 엄청난 메모리 누수가 발생합니다. 아래에서 내 앱의 간단한 코드 샘플을 볼 수 있습니다. 함수에서 "(m1 ..."줄을 사용하지 않으면 누수가 없습니다. 그러나 이미지는 처리되지 않습니다.) 잠금, 풀 등을 시도했지만 아무 것도 변경되지 않았습니다. 비교적 새로운 기능입니다. 코코아로 모든이 대괄호가 나에게 재미 있고 두려운 것처럼 보입니다 ;-)
"char
"을 사용하는 데 문제가 있습니까? 내 오래된 리눅스 + C에서 + + 애플 리케이션 거기에 아무 문제가 없었다. 하지만, 어떤 스레드를 "서명되지 않은 숯불 *"를 사용하지 않고 있었고, 나는- (void) processImage : (char *) image; --- 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

는 "*을 (M1 ..."기능의 선은, 그건 그냥 할당합니다.. 사실

아무 누출도 없다. 어느 쪽이든이 더 누출 어쨌든 없다, 또는 누수의 원인이 아니다.

당신은 유출받을 객체 (일반 메모리 할당과 코코아 객체 모두)를 찾기 위해 악기를 사용할 수 있으며, 누수를 진단 할

.

이 그것을 문제입니다 "ch"를 사용하여 ar * "?

번호 유형으로 인해 누출이 발생하지 않습니다. 잘못된 메모리 관리로 인해 누수가 발생합니다.

내 오래된 Linux + C++ 앱에는 문제가 없었습니다. 하지만 "unsigned char *", 스레드가 사용되지 않았고 누출 여부를 확인한 적이 없습니다 ...

스레드를 추가하거나 코코아 코드를 추가 할 때 누수가 도입되었을 가능성이 있습니다. 누설은 항상 거기에 있었고 전에는 그것을 본 적이 없다는 것도 똑같이 가능합니다. Instruments 또는 다른 도구로 문제를 발견했을 때만 알 수 있습니다.

또한 Clang 정적 분석기를 실행 해보십시오. 다른 것들 중에서 누출을 일으키는 코드 패턴을 감지 할 수 있습니다.

+0

정적 분석기가 몇 가지 문제점을 발견했지만 누출은 없었습니다. 악기 (v1.5에서 xcode v3.1) (그 라인이 활성화되었을 때만) 거대한 누출을 발견했지만 ... 그것은 CVObject가 496 B를 가지고 있다고 말했습니다. CVObject, EventType = malloc, size = 496, ResponsibleLibrary = CoreVideo, ResponsiblCaller = CVObject :: alloc (.., long, ..const)이 코드에는 CVObject가 포함되어 있지 않습니다. , .. 긴, 긴) ..... 감사합니다 ..... ..... – ravyr

+0

496 바이트는 "거대한 누출"이 아닙니다. net 객체 수로 목록을 정렬 한 다음 Cocoa 나 Core Foundation이 아닌 클래스를 찾으십시오. –

+1

답변 해 주셔서 감사합니다. 그것은 나에게 많은 도움이되었습니다. 올바른 도구를 사용하여 마침내 올바른 방향으로 검색하기 시작했습니다 ... # 496B를 "거대한 누출"이라고 오인 한 것처럼 #net은 누출을 표시하지 않았습니다 ... 그러나 다른 악기 관찰 실행 중이고, 나는 "GeneralBlock-618496"이 상대적으로 작은 # net 수를 보였지만 거대한 NetBytes는 - 1 분이 지나면 500MB가 넘는 것으로 나타났습니다. CVPixelBufferBacking :: initWithPixelBufferDescription (...) 그래서 지금 내가 잃어버린 것을 알았고 지금은 다시 궤도에 진입했다고 가정합니다 .- – ravyr

-1

불충분 한 대답 ... 알아요. 그러나 더 좋은 대답이없는 경우에 대비하십시오. 함수를 항상 C 파일에 넣고이를 일반화 할 수 있습니다. c.

누출을 해결하면 좋을지도 모릅니다. 그렇지 않다면 문제는 다른 곳에 있습니다. 내가하지 않으면

+0

나는 그것을 시도하고 싶을지도 모르지만, 불행히도 나는 코코아쪽으로 가야하고, "뒤로"c/C++로 가지 않아야한다.
..... 물론 아무 것도 도움이되지 않는다면 나는 ..... 그렇게 해보 죠. 감사. – ravyr

+0

그래서 .... 누설이 완전히 다른 곳에서 있었기 때문에 나는 이것을 시도하지 않을 것이라는 것이 밝혀졌습니다.어쨌든 - 시간과 "좋은 뜻"을 주셔서 감사합니다 – ravyr

관련 문제