2017-04-25 19 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); 

Iは、別のスレッド(特に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) 

は、次のコンストラクタを使用すると思います。トリックを行う可能性があります非const関数を呼び出し、QImageは牛を使用を念頭に置いて、実際のデータのコピーを作成することについては

(ただし、それを自分自身をテストしていません):

uchar *QImage::bits() 

QImageは暗黙のデータ共有を使用することに注意してください。この関数は、共有ピクセルデータの深いコピー を実行し、このQImageが現在の戻り値を使用する唯一の であることを保証します。

またauto newImage = img.copy();

単に試してみてください
関連する問題