2012-05-07 18 views
2

私はQtライブラリを使ってC++で書かれたGUIを持っています。私のアプリケーションでは、TreeViewオブジェクトを使用しました。このオブジェクトの再利用を容易にするために、私はQObjectsが継承できるテンプレートクラスを作成しました。 MOCは、テンプレートクラスで働くことができないので、私はこのようなクラスを作った:テンプレートの利点を取得中終了時にQtアプリケーションがクラッシュする

class Tree : public QObject, public TreeTemplate<TreeType, TreeItemType> 
{ 
    Q_OBJECT 
}; 

これは、(TreeTemplateはQObjectをを継承するか、Q_OBJECTマクロを使用していない)だけTreeクラスはMOCを使用することができます。

私の問題は、私のアプリケーションを終了すると、(QApplicationクリーンアップを終了してスキップしても)クラッシュしてしまうことです。私は、 "静的メタオブジェクト"を使って、mocの生成クラスに問題があると思っています

処理できない__ASM__の使用のため、valgrindは使用できません。 :-(

テンプレートクラスから継承テンプレートQtのクラスを使用して(+ MOC)の私のデザインは、この問題を引き起こす場合は、誰もが知ってい

クラッシュである:?。終了後のlibc.so

+2

gdbバックトレースには何が表示されますか? –

+1

空の仮想デストラクタを追加すると何か変更されますか? –

+3

Qtの終了時の私のクラッシュの大部分は、クラスのインスタンスを2倍にしたときに発生しました。ほとんどの場合、これは所有権を持つQtコンテナにクラスのインスタンスを渡したとき(コンテナが自動的に破棄する)、自分のコードで破棄しようとしたときに発生します。 – jwernerny

答えて

1
QObjectとテンプレートクラスが動作しない理由

私の知る限り、あなたのアプローチは機能しません

mocをC++プリプロセッサの前に走っている、それはだ - 。プリプロセッサはまだクラスを生成していないあなたはので、クラスをtemplatizingていますmocのクラスに関するデータは、どのようなものであっても署名に一致しませんプリプロセッサ中にプレートクラスが作成されます。

+0

これは動作しますが、破壊するとクラッシュします。 – Alex

+0

それは動作しません。コードの最後の行をバックトレースで表示できますか?失敗した場所はどこですか?私はvalgrindを使用することはできませんが、あなたのデバッガは、少なくとも問題の開始場所を表示することをありがたいです。 – cmannett85

+0

あなたのコメントが本当であれば、 "クラスはプリプロセッサ中にそれから作成されたどんなテンプレートクラスの署名とも一致しません"と私はそれがコンパイルされないと思います。それは私が意味していたものです。それは破壊まで完璧に動作します。 私は少しスタックトレースを取得します。 – Alex

関連する問題