質問
私は新しいUIダイアログ(ウィジェット)を持ち出すにはQtアプリケーションその用途のQPointersを持っています。主なアプリケーションは、異なるデータをロードし、同じウィジェットの数々を持つことができます。私がいる問題は、削除して、各ウィジェットのメモリを解放しています。私はプログラムのRAMの使用状況を監視する場合、私はこれらの新しいウィジェットのオープン1にあるボタンをクリックするたびに、それはラムを高め、私はウィジェットを閉じたとき、それはラムを解放していないようです。私はdeleteLater
や他のソリューションを使用してみましたが、プログラムでクラッシュを得続けるました。
いくつかのサンプルコードはここにある:
QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();
このはQDialog
(モーダルNOT)として宣言されている「ListReservations」ウィジェットを呼び出します。そのダイアログで、私はその後、QWidget::close()
スロットを呼び出し、ウィンドウを閉じるためのボタンがあります。
私は(可能であれば)ダイアログとを解放し、ダイアログを閉じたときに質問がどのように(QPointer
を持っている)私のメインプログラムが知っているんだと思いますし、さらに多くのメモリを節約するためにポインタを削除...
私はあなたがQConnect()
オブジェクトにQPointer
を行うことができるかもしれないと思ったが、私は、ダイアログが実際に閉じられると、信号を送ってはるかに少ない、ポインタの通過を可能にする任意のシグナルまたはスロットを見つけることができないよう削除の準備ができます。
たぶん私はそれ自身の近くにスロットを呼び出す前にすることをQDialogコールを持って、汎用ポインタオブジェクトを取り、メインプログラム内の関数のいくつかの並べ替えがありますか?その関数では、それが破壊されるように自身を渡すでしょうか?ただ、私が....
を実装しようとしたが失敗したことのアイデアを投げ私は理論的には、Windowsを同時に開いて、複数のListReservationsを持っている可能性があるため、私は他の場所で同じポインタを再利用することができないと思います。
解決
あなたはQt::WA_DeleteOnClose
を使用して、ダイアログ上QWidget::setAttribute()
属性フラグを設定していることを確認してください。それは、それが閉じているときに、ダイアログが適切に破棄されることを確認してください。詳細については Qtのドキュメントを参照してください。
は、メモリが正しく解放されたと仮定すると、ポインタは Qtのドキュメントから、自分自身を無効にする必要があり>
Aガード付きポインタ、QPointer、 通常のC ++ポインタT *のように振る舞います、 それが自動的に設定されていることを除き、 0参照されるオブジェクトであります 、通常のC ++のポインタとは異なり、(破壊されました で、「ダングリングポインタ」となっています そのような場合)