2016-07-12 4 views
2

認証ウィジェットとメインウィンドウを持つQtアプリケーションを開発しました。認証の後、私はこのコードQt double freeまたは破損

this->~Authentification(); 
MainWindow *w = new MainWindow(); 

を使用してメインウィンドウを開くが、私は、メインウィンドウを閉じた後、私はダブル無料または破損エラーが表示さ成功。デバッグは、このエラーの原因は、あなたが明示的にthisにデストラクタを呼び出しているクラスAuthentification

+0

ん真偽inehrit?また、技術的に可能な限りクラス内からデストラクタを呼び出すのは、somethnigが間違っていたらデバッグするのが難しいです(後で触れないことを保証する必要があります)。認証がQObjectの場合は、this-> deleteLater();を使用することをお勧めします。さらに、MainWindowに親を渡さないで、今破壊されたクラスでnewを呼び出すので、削除するポインタを取得できない可能性があるため、メモリがリークします。あなたがその呼び出しの後にそれを表示し、それを削除すると...あなたはまだ破壊されたクラスで動作しています。非常に悪いデザインの決定のように見えます。 – Resurrection

+0

デストラクタを明示的に呼び出さないでください。まれなケースである「配置の新しさ」を除いて。 – ilotXXI

+0

はい認証はQObjectのQWidgetとinehritです。問題は私がthis->〜Authentification();と呼んだときです。認証クラスは完全に閉じられていません。メインウィンドウを閉じると、もう一度〜Authentification()を呼び出します。 – Dababi

答えて

1

から

delete ui; 

であると述べました。これを行う必要がある時間はほとんどなく、常に抽象化する必要があります。このような呼び出しは、低レベルのリソース管理クラスにのみ属します。 QObjectまたはQWidgetのサブクラスでこれを行うと考えている場合は、ほとんどありません。

ウィンドウを閉じる場合は、QWidget::close()を使用してください。しかし、ウィジェットインスタンスを破棄して、ウィジェットインスタンスが使用するリソースを解放したい場合もあります。それから読んでください。

のはAuthenticationは、認証がそれぞれ、成功または失敗したときに、必要に応じてaccepted()rejected()信号を発する適切なダイアログであると仮定しよう:

class Authentication : public QDialog { 
    ... 
}; 

、このようなダイアログから手続のいくつかの方法があるかもしれない:

  1. ダイアログがスコープのローカル変数として定義され、ダイアログがアクティブである限りイベントループを実行し、スコープから離します。

    int main(int argc, char ** argv) { 
        QApplication app{argc, argv}; 
        { 
        Authentication auth; 
        auto result = auth.exec(); 
        if (result == QDialog::Rejected) return 1; 
        } // here auth has been destructed 
        MainWindow window; 
        window.show(); 
        return app.exec(); 
    } 
    
  2. ダイアログを動的に割り当て、閉じたときに自動的に削除されます。万が一のQObjectから

    int main(int argc, char ** argv) { 
        QApplication app{argc, argv}; 
        auto auth = new Authentication; 
        auth->setAttribute(Qt::WA_DeleteOnClose); 
        QObject::connect(auth, &QDialog::accepted, []{ 
        auto win = new MainWindow; 
        win->setAttribute(Qt::WA_DeleteOnClose); 
        win->show(); 
        }); 
        auth->show(); 
        return app.exec(); 
    } 
    
+0

ありがとうございます、あなたのコードは完全に動作します – Dababi

関連する問題