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