2011-08-11 16 views
1

私は標準的なQWidget派生クラスを持っていますが、ウィジェットの破棄時には二重解放されます。私はメンバ変数としてQTreeViewポインタを追加するたびに。QWidgetの削除の問題

例えば:クラスのコンストラクタで

private: 
    QTreeView *m_treeView; 

、私は簡単な操作を行います。

m_treeView = new QTreeView(this); 

そしてQWidgetの派生クラスのデストラクタは、デフォルトのデストラクタです。

私はメンバーを使用して断念した場合、完全にポインタの操作を行います。

QTreeView *treeView = new QTreeView(this); 

すべてが正常です。 QLabelメンバポインタを持つこともうまくいきます。なぜ私はこの行動を見ているのですか?ポインタがクラスのメンバであるかどうかは、オブジェクトがヒープ上に作成されているため、クラスのデストラクタには関係がありません。また、クラス内で指示されない限り、メンバ変数が指し示すオブジェクトはクラスによって削除されません。カスタムデストラクタ。あなたのQWidgetの派生オブジェクトが削除されるたびに、あなたはnew QTreeView(this)が最終的QObject(QObject * parent)を呼び出しますので、これが起こると、それはあなたのメンバ変数は次のように追加される意味m_treeView

を構築する場合、親オブジェクトとしてthisを渡されたので、

+0

これはかなり平凡な問題であることが判明しました。このクラスを2番目のディレクトリに移動しましたが、何らかの理由でqmakeが、QWidget派生クラスを再構築するために必要なMainWindowクラスをマークしていませんでした。 ポインタをメンバ変数として追加すると、クラスのサイズが変更され、削除時にメモリ破損の問題が発生しました。私はクラスのコンストラクタのABIを変更していないので、アプリケーションターゲットはまだリンクされていますが、QWidgetから派生したクラスのサイズの変更は、すべての問題を引き起こしました。 –

答えて

0

m_treeViewも削除されますあなたのQWidgetから派生したオブジェクトの子オブジェクト。

親オブジェクトのデストラクタは、すべての子オブジェクトを破棄します。 申し訳ありませんが、

を逃し、QWidgetの派生クラスのデストラクタは、デフォルトのデストラクタです:the Qt docs

EDITから

一部

+0

ええ、それは_double_フリーを説明しません。メンバー以外の変数のバージョンも "this"を親にしているので、同じ動作が期待されます。 それは腐敗ではなく、二重の自由である。それはファイルの移動とqmakeがそれを検出しないためにメモリ破損であることが判明しました。私は私の元の質問にコメントとして詳細を掲載しました。 –

+0

@Jonathan私はポインタを自分で削除したかもしれないと思ったが、あなたの質問を読んで、あなたが – dirk

関連する問題