2

私のアプリケーションはウェブカメラの画像をにストリーミングし、QWidget表示された後はそれらの画像を必要としません。アプリケーションは約1〜2分間実行されてから、このエラーが数十回発生してクラッシュします。

QImage: out of memory, returning null image

は、 1秒間に数回呼び出されるメソッドをQWidget使用します。displayImage(QImage)画像はポインタをパラメータとしてとらなければならないような気がしますが、それを裏付ける理由はありません。

QImageをメモリから確実に解放するにはどうすればよいですか?

注:画像を作成するには、SOの質問の受け入れられた回答で説明されている手法を使用して、opencv cv::Matをqimageに変換する方法を使用します

4

2 に答える 2

1

QImageクラスは、暗黙的なデータ共有を使用します。ドキュメントからの抜粋:

Qtの多くのC++クラスは、暗黙的なデータ共有を使用して、リソースの使用量を最大化し、コピーを最小化します。暗黙的に共有されるクラスは、引数として渡されると安全かつ効率的です。これは、データへのポインターのみが渡され、関数がデータに書き込む場合、つまりコピーオンライトの場合にのみデータがコピーされるためです。

共有クラスは、参照カウントとデータを含む共有データブロックへのポインターで構成されます。

共有オブジェクトが作成されると、参照カウントが1に設定されます。参照カウントは、新しいオブジェクトが共有データを参照するたびにインクリメントされ、オブジェクトが共有データを逆参照するときにデクリメントされます。参照カウントがゼロになると、共有データは削除されます。

暗黙の共有は舞台裏で行われます。プログラマーはそれについて心配する必要はありません。

つまり、QImageオブジェクトを値でdisplayImage()に渡すと、新しいQImageが作成されますが、最初のQImageの画像データは複製されず、共有参照カウンターのみがインクリメントされます。ただし、これは、最初に割り当てられたQImageオブジェクトのメモリを解放する場合は、両方のQImageオブジェクトがスコープ外になることを確認する必要があることも意味します。

于 2013-02-13T08:12:25.093 に答える
0

暗黙の共有に関するドキュメントに記載されているように:

共有オブジェクトが作成されると、参照カウントが1に設定されます。参照カウントは、新しいオブジェクトが共有データを参照するたびにインクリメントされ、オブジェクトが共有データを逆参照するときにデクリメントされます。参照カウントがゼロになると、共有データは削除されます。

QImageこれは、コードのどこかでフレームを参照する必要があることを意味します。

于 2013-02-13T08:04:04.637 に答える