2012-06-04 3 views
2

나는 이상한 일에 대해 혼란 스럽다. ... 나는 서명되지 않은 char 배열을 가지고있다 ... 나는 그것을 calloc을 사용하여 할당하고 그것에 몇 바이트의 데이터를 기록한다. 이 서명되지 않은 char 및 다시 할당 할 이전 메모리 할당 된 동일한 주소를 참조하십시오. 나는 이유를 이해한다. 그러나 나는 내가 두 번째로 쓰려고하는 데이터가 쓰여지지 않은 이유를 이해할 수 없다. 처음 쓰여진 데이터가 쓰여졌다. 아무도 나에게 이것을 설명 할 수 있을까? ?????? unsigned char 할당 및 무료 문제

unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));

내가 그것을 할당하는 방법입니다 .... 사실 내 문제는 때문에 한 번 매 2 초 나는를 해제하려고 할 때 메모리 누수가 ...하지만이 일이 할당의 할당 된 메모리 부문은 ... 여기 ... 누군가가 나를 도울 수 있다면

가 .... 내가 그렇게 기쁠

하십시오 :(.... 을 것은 위에서 설명한 발생하는 코드입니다

- (unsigned char*) createBitmapContext:(UIImage*)anImage{ 

CGImageRef imageRef = [anImage CGImage]; 
NSUInteger width = CGImageGetWidth(imageRef); 
NSUInteger height = CGImageGetHeight(imageRef); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char)); 
bytesPerPixel = 4; 
bytesPerRow = bytesPerPixel * width; 

NSUInteger bitsPerComponent = 8; 
CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
              bitsPerComponent, bytesPerRow, colorSpace, 
              kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

CGColorSpaceRelease(colorSpace); 
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 

CGContextRelease(context); 

imageRef=nil; 
return rawData; } 

이 코드에는 부품이 없습니다. 어디 무료 (rawData), 그리고 내가이 메서드 안쪽에 그것을 무료로 할 수 없기 때문에 전 세계적으로 rawData를 정의하고이 메소드를 호출 한 후에 그것을 자유롭게하려고 시도했지만 ... 아무 것도 흥미롭지 않습니다. ... 나는 매우 기뻐할 것입니다 ...

+0

할당 및 버퍼 쓰기와 내용을 확인하는 방법을 보여주는 완전한 코드 조각을 제공해야합니다. 위 내용만으로는 질문에 답변 할 수 없습니다. – gavinb

+0

@ gavinb done ... 재미있는 아이디어? – Garnik

답변

1

좋아,이 방법은 UIImage을 새롭게 할당 된 바이트 버퍼로 렌더링하고 버퍼를 호출자에게 반환합니다. calloc으로 할당하므로 0으로 초기화 된 다음 이미지 내용으로 덮어 씁니다.

나는 그것을 이전 시간

할당 된 메모리에 같은 주소를 보유 볼이 서명 숯불을 해제하고 다시 할당 할 때

예, 버퍼의 위치에 대한 보장은 없다 메모리에. 반환 된 메모리에 free()을 호출한다고 가정하면 정확히 동일한 크기를 요청하면 동일한 버퍼가 다시 제공 될 가능성이 큽니다. 그러나 내용이 두 번 이상 기록되지 않는 것을 어떻게 확인하고 있습니까? 무엇 은 버퍼에입니까? ....

내 문제는 그 때문에 한 번 내가 메모리 누수가 매 2 초를 일이 할당입니다 ...하지만 할당 된 메모리 부문을 확보하려고 할 때는 것은 위에서 설명한 발생 :(

누수가있는 경우 여기에 명백한 누출이 없으므로이 메서드를 호출하는 코드에서 가능성이 있습니다.이 메서드는 호출자가 버퍼를 해제해야하는 것과 같습니다.

또한 이 올바르게 작성되었는지 확인 중이십니까? me 작성 플래그 또는 매개 변수로 인해 오류가 발생할 수 있습니다. 따라서 context (적어도 nil이 아님)이 유효한지 확인하십시오. 그 이유는 내용이 덮어 쓰여지지 않는 이유를 설명 할 수 있습니다.

메모리를 새로 업데이트하는 쉬운 방법 중 하나는 자신의 데이터를 기록하는 것입니다. 버퍼로 카운터를 채우고 메소드 외부에서이를 확인할 수 있습니다.예를 들어, 당신은 rawData을 반환하기 전에 :

static unsigned updateCounter = 0; 
memset(rawData, updateCounter & 0xff, width*height*4); 

이 의지주기를 쉽게 확인할 수 있습니다 버퍼로 255을 기록을 통해.

또 다른 것은 -이 코드로 무엇을 달성하려고합니까? 달성하려는 목표를 달성하기위한 더 쉬운 방법이있을 수 있습니다. 메타 데이터가없는 베어 버퍼를 반환하는 것이 반드시 이미지를 관리하는 최선의 방법은 아닙니다.

+0

내 프로젝트의 목적은 화면 공유 도구를 작성하는 것입니다. 이 방법을 사용하여 픽셀 색상을 얻고 이전 그림과 유사성을 비교하고 싶습니다. 그 다음 다른 방법으로 나는 그 2 명의 사진의 차이를 얻었고, 변경되었던 부분을 보내라. 모든이 부품은하게된다. 그러나 나는이 누설을 가지고있다. 나는 언제나 다음 그림을 얻으므로 문맥 상 틀림 없습니다. 또한 memset (rawData, 0, weight * height * 4)을 0으로 설정하려고했습니다. 내가 해방 한 후에도 마찬가지다. 왜 매번 동일한 주소를 반환하는지 이해하지만 CGBitmapContextCreate 메서드가 내부 데이터를 덮어 쓰지 않는 이유를 이해할 수 없습니다. – Garnik

+0

또한 누수가 rawData 할당에 있다고 확신합니다 ... 백 가지 방법으로 확인했습니다 ... – Garnik

+0

예. 매개 변수 순서를 알고 있지만 ...이 부분이 도움이되지 않습니다. – Garnik

0

나는이 문제를 해결 그래서 너희들은 ... 우선 나는 내가 oldRawData에이 I에 의해 newRawData를 할당 어디 부분을 놓친이 외에 ... 다음이

- (void) createBitmapContext:(UIImage*)anImage andRawData:(unsigned char *)theRawData{ 

CGImageRef imageRef = [anImage CGImage]; 
NSUInteger width = CGImageGetWidth(imageRef); 
NSUInteger height = CGImageGetHeight(imageRef); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
// unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char)); 
bytesPerPixel = 4; 
bytesPerRow = bytesPerPixel * width; 

NSUInteger bitsPerComponent = 8; 
CGContextRef context = CGBitmapContextCreate(theRawData, width, height, 
              bitsPerComponent, bytesPerRow, colorSpace, 
              kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

CGColorSpaceRelease(colorSpace); 
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 

CGContextRelease(context); 
imageRef=nil; 
// return theRawData;} 

에 createBitmapContext 방법을 변경했습니다 같은 메모리 주소에 두 포인터가 있었는데 ... 여기에서 문제가 왔어 ... 나는이 memcpy (rawDataForOldImage, rawDataForNewImage, newCapturedImage.size.width * newCapturedImage.size.height * 4)로이 할당 부분을 변경했다. 여기에 문제가 해결되었습니다 .... 감사합니다 모두

관련 문제