2

つい最近、自分のコンピューターに Qt ライブラリをインストールしました。完全な初心者として、Qt 4.7 入門ガイドをオンラインで調べました。

最初のページだけで、次のコードが提供されます。

  1        #include <QtGui>
  2
  3        int main(int argv, char **args)
  4        {
  5            QApplication app(argv, args);
  6
  7            QTextEdit textEdit;
  8            QPushButton quitButton("Quit");
  9
 10            QObject::connect(&quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
 11
 12            QVBoxLayout layout;
 13            layout.addWidget(&textEdit);
 14            layout.addWidget(&quitButton);
 15
 16            QWidget window;
 17            window.setLayout(&layout);
 18
 19            window.show();
 20
 21            return app.exec();
 22        }

シンプルなものだと思います。Visual Studio Express 2010 でこのコードを記述し、ビルドして実行すると、ほとんどすべてが機能します。ただし、「Quit」ボタンまたは表示されたウィンドウの右上にある赤い x (「return app.exec()」を開始) を使用してウィンドウを閉じようとすると、次のメッセージが表示されます。

ダイアログボックスに、

ParticleTracker.exe の 0x77bc15de で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xdf94b4b4。

そしてコンソール出力は、

Critical error detected c0000374
Windows has triggered a breakpoint in ParticleTracker.exe.

This may be due to a corruption of the heap, which indicates a bug in ParticleTracker.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while ParticleTracker.exe has focus.

デバッグ モードに入ると、ヒープ破損エラーを繰り返し受け取りながらコール スタックを続行しました。

First-chance exception at 0x77c6e6c3 in ParticleTracker.exe: 0xC0000374: A heap has been corrupted.
Unhandled exception at 0x77bc15de in ParticleTracker.exe: 0xC0000374: A heap has been corrupted.

その後のすべての例外は、実行可能ファイルの 0x77bc15de で発生し、メモリ アドレス 0xC0000374 は破損したヒープとして発生しました。

正直なところ、どうすればこの問題が発生するのか正確にはわかりません。私は C++ に精通していませんが、コードに問題はないようです。

Call-Stack では、プロセスは現在次の場所でスタックしています: ParticleTracker.exe!main(int argv, char** args) 20 行目 + 0x27 バイト 逆アセンブリに入ると、プロセスは次の場所でスタックしています:

return app.exec();
00FE3831  mov         esi,esp  
00FE3833  call        dword ptr [__imp_QApplication::exec (0FE93D0h)]  
00FE3839  cmp         esi,esp  
00FE383B  call        @ILT+320(__RTC_CheckEsp) (0FE1145h)  
00FE3840  mov         dword ptr [ebp-150h],eax  
00FE3846  mov         byte ptr [ebp-4],5  
00FE384A  mov         esi,esp  
00FE384C  lea         ecx,[ebp-84h]  
00FE3852  call        dword ptr [__imp_QWidget::~QWidget (0FE9404h)]  
00FE3858  cmp         esi,esp  

任意のヒント?とても有難い。:)

4

2 に答える 2

1

これを試してみてください

#include <QtGui>

int main(int argv, char **args)
{
      QApplication app(argv, args);

      QTextEdit *textEdit = new QTextEdit();
      QPushButton *quitButton = new QPushButton("Quit");

      QObject::connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));

      QVBoxLayout *layout = new QVBoxLayout();
      layout->addWidget(textEdit);
      layout->addWidget(quitButton);

      QWidget *window = new QWidget();
      window->setLayout(layout);

      window->show();

      return app.exec();
  }
于 2012-07-01T13:23:26.560 に答える
0

所有権の問題かもしれません。ウィジェットが破棄されると、その子、あなたの場合はレイアウトと子ウィジェットも処理されます。QWidget デストラクタはオブジェクトを破棄しようとしますが、それらは動的ではなくスタックに割り当てられました。

QLayout とウィジェットに動的割り当てを使用してみてください。

于 2012-07-01T12:57:33.940 に答える