2017-04-25 43 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當最後一個副本 破壞將被調用一起提供一個函數指針cleanupFunction

你會使用下面的構造函數:

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

差不多你有什麼安全的實際清理指針。

至於使數據的實際拷貝,牢記QImage使用牛,調用非const函數可能做的伎倆(沒有雖然測試它自己):

uchar *QImage::bits() 

請注意,QImage使用隱式數據共享。此功能執行共享像素數據的深層副本 ,從而確保此QImage是使用當前返回值的唯一一個 。

您也可以嘗試簡單auto newImage = img.copy();

相關問題