つい最近、自分のコンピューターに 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
任意のヒント?とても有難い。:)