3

QPointers新しい UI ダイアログ (ウィジェット) を表示するために使用する Qt アプリがあります。メイン アプリには、異なるデータをロードした同じウィジェットを多数含めることができます。私が抱えている問題は、各ウィジェットのメモリを削除して解放することです。プログラムのRAM使用量を監視すると、ボタンをクリックしてこれらの新しいウィジェットの1つを開くたびにRAMが増加し、ウィジェットを閉じるとRAMが解放されないようです. および他のソリューションを使用してみましdeleteLaterたが、プログラムでクラッシュが発生し続けます。

サンプルコードは次のとおりです。

QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();

これは(非モーダル)ListReservationsとして宣言された " " ウィジェットを呼び出します。QDialogそのダイアログには、QWidget::close()スロットを呼び出すウィンドウを閉じるボタンがあります。

QPointer問題は、ダイアログが閉じられたときに私のメインプログラム( .

QConnect()オブジェクトに aを実行できると思いましたQPointerが、ポインターの受け渡しを許可する信号またはスロットが見つからないようです。ダイアログが実際に閉じられて削除の準備ができたら、信号を送信することはほとんどありません。

QDialogたぶん、メインプログラムで、汎用ポインターオブジェクトを受け取り、それを呼び出す前に独自のクローズスロットを呼び出す何らかの関数が必要ですか? その機能では、それ自体が破壊されることになりますか? 実装しようとして失敗したアイデアを捨てるだけです....

ListReservations理論的には同時に複数のウィンドウを開くことができるため、同じポインターを他の場所で再利用できるとは思いません。

4

1 に答える 1

3

Qt::WA_DeleteOnCloseを使用してダイアログに属性フラグを設定していることを確認してくださいQWidget::setAttribute()。これにより、ダイアログが閉じられたときにダイアログが適切に破棄されるようになります。詳細については、Qt のドキュメントを参照してください。

Qtのドキュメントから、メモリが適切に解放されたと仮定すると、ポインターはそれ自体を無効にする必要があります。

保護されたポインター QPointer は、通常の C++ ポインター T * のように動作しますが、参照されたオブジェクトが破棄されると自動的に 0 に設定される点が異なります (通常の C++ ポインターとは異なり、このような場合は「ダングリング ポインター」になります)。

于 2010-03-03T16:34:40.833 に答える