2012-03-11 11 views
0

私はメインウィンドウのアプリケーションを持っています。ショートカットが起動されるとダイアログがポップアップして情報を表示し、このダイアログで設定を行い、メインウィンドウ、メインウィンドウはいくつかの追加作業を行います。擬似コードは次のようになります。Qtはboost :: shared_ptrの信号とスロットを接続します

void MainWindow::actionConfigure_triggered() 
{ 

    configureDialog = boost::shared_ptr<configure>(new configure(this)); 
    configureDialog->show(); 
    connect(configureDialog.get(), SIGNAL(reload()), this, SLOT(clean_reload())); 
} 

この機能を何回かトリガーすると、セグメント化エラーが発生します。 boost :: checked_delete関数を実行すると、SIGSEGVが受け取った実行をトレースするためにデバッガを使用します。

ご協力いただきますようお願い申し上げます。前もって感謝します。 設定ダイアログを動的に作成して削除したい、またはこれを実装する他のより良い方法がありますか?

+0

私はスマートなポインタを使う必要はないと思います。設定ダイアログが閉じられたら、デストラクタを呼び出す必要があります。この時点で動的に割り当てられたメモリを解放する必要があります。何度も何度も機能するのですか? – nils

+0

ダイアログボックスは、setAttribute(Qt :: WA_DeleteOnClose)を設定しない限り、閉じても自分自身を削除しません。 –

+0

ありがとうございます。 – nils

答えて

0

バックトレースによれば、バグはconfigureのデストラクタのどこかにあり、shared_ptrとはほとんど関係がありません(ただし、デストラクタを呼び出すshared_ptr以外) オブジェクトが二重に削除されていないかチェックしますおそらくオブジェクトを削除するshared_ptrではない他の参照があります。

+0

お返事ありがとうございます。私は問題を見つけました、そうです、これはshared_ptrの問題ではありません。shared_ptrに新しい値を割り当てると、それは以前に指摘した元のメモリを解放しようとします。これはそのクラスのデストラクタを呼び出します。 configureDialogのデストラクタで、まだメモリを割り当てていないポインタを解放しようとします。 Qt :: WA_DeleteOnCloseフラグを使うと、ウィジェットがcloseイベントを受け入れたときにQtがこのウィジェットを削除するので、メモリリークを防ぐためにスマートポインタの代わりにこれを使うこともできます。 – nils

関連する問題