2017-04-25 2 views
0

나는이 같은 QImage 만들 :QImage에 제공된 데이터는 언제 삭제할 수 있습니까?

unsigned char* const rawImage = (unsigned char*)std::malloc(WIDTH*HEIGHT*3); 
for (...) { 
    // Populate the image here 
} 
QImage img(rawImage, WIDTH, HEIGHT, QImage::Format_RGB888); 

은 그때 다른 스레드에 해당 이미지와 신호를 게시 (특히 GUI 스레드) :

emit imageRendered(img); 

은 내가 나중에 데이터를 삭제할 수 있습니다 생각 :

delete rawImage; 

하지만 다른 스레드에서 세그먼트 오류가 발생합니다. 원시 이미지를 삭제하지 않으면 프로그램에서 사용 가능한 모든 메모리를 사용합니다. 원시 데이터를 삭제할 수 있도록 QImage의 안전한 복사본을 만드는 방법은 무엇입니까?

답변

0

문서는 주제에 꽤 특정 :

버퍼 는 QImage의 수명과 원래 버퍼에서 수정되거나 분리되지 않은 모든 사본에 걸쳐 유효해야합니다. 이미지는 파기시 버퍼를 삭제하지 않습니다. 함수 포인터 정리 함수과 포인터 cleanupInfo (마지막 복사본이 인 경우 호출됩니다)을 제공 할 수 있습니다. 실제 정리 포인터를 위해 꽤 많은 당신은 안전 무슨

QImage::QImage(uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR) 

:

는 다음과 같은 생성자를 사용하십시오. 트릭을 할 수있는 const가 아닌 함수를 호출, QImage 암소를 사용 염두에두고, 데이터의 실제 복사본을 만들기에 관해서는

(비록 나 자신을 테스트하지 않았습니다) :

uchar *QImage::bits() 

QImage는 암시적인 데이터 공유를 사용합니다. 이 함수는 공유 픽셀 데이터의 전체 복사본을 수행하므로이 QImage가 현재 반환 값을 사용하는 인지 확인합니다.

또한 단순히 auto newImage = img.copy();

을 시도 할 수 있습니다
관련 문제