1

1 つの Qt ダイアログの初期化が 1 つの QLineEdit のプライベート データへのポインタを返した後、0 に設定されます。ダイアログの生成された setupUi() 内にある間、ポインタはまだ有効です。その後、この特定の QLineEdit の構造が壊れているようです。

デバッガー内で実行している場合とデバッガーなしで実行している場合の両方で、アプリケーションがクラッシュします。

シングルスレッド アプリケーション。

QtCreator 2.7.0。

CMake プロジェクト。

MinGW 20120426 と g++ 4.6.2 (32 ビット アプリケーション):

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.6.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.6.2 (GCC)

ウィンドウズ7 64ビット。

'Locals and Expressions' の下部に表示されている他の QLineEdit 'kundenbestellcodeLineEdit' は正常に見えます。

Q: 誰かがこれを経験したことがありますか? また、なぜこれが起こるのか知っていますか?

正常に動作する他のダイアログを備えたユースケースが他にもいくつかありますが、なぜこの 1 つだけが問題を引き起こすのでしょうか?

g++ 4.7.2 を使用した Linux Debian Wheezy のリリース ビルドでこれを再現できます。

新しい情報: 'Dialog_Auswahl_des_Geraetemodells' という同じ名前の 2 番目の QDialog が、別のユースケース ディレクトリ (ファイル システム) と別の名前空間に存在します。この 2 番目のダイアログをリンク フェーズから削除すると、クラッシュは発生しません。

詳細情報: 2 番目のダイアログ クラスの名前を変更すると、クラッシュは発生しなくなります。ダイアログ オブジェクト ファイル (Dialog_ .o、moc_Dialog_ .o) が期待されるシンボルを提供することを確認するために、リンカー シンボルを確認しました。また、ユースケース パスが moc_*.cxx ファイル内に表示されることも確認しました。

この問題は実行時にのみ発生するため、Qt オブジェクト システムに、異なるフォルダー/名前空間内の同じ名前のクラスに関する問題があると想定する必要があります。

すでに述べたように、回避策は、これらのクラスのいずれかの名前を変更することです。

破損した d ポインターを表示します

4

1 に答える 1

0

一般的な答えは、qmakeを実行してからプロジェクトをビルドし、ui ファイル用に更新された生成コードをコンパイルすることです。

それでも問題が解決しない場合は、質問を更新して、その状況に陥るために何をしたかについての情報を追加する必要があると思います。おそらく、誰かがより良いアドバイスを与えることができるでしょう。ウィジェットの?

于 2013-05-24T09:09:02.953 に答える