Qt堆样本提供代码的腐败

时间:2012-06-21 14:22:22

标签: c++ visual-studio-2010 qt heap corruption

就在最近,我已经在我的计算机上安装了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中编写此代码,构建和运行时,大多数都可以正常工作。但是,当我尝试通过“退出”按钮或显示窗口右上角的红色x(启动“返回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  

任何提示?非常感激。 :)

2 个答案:

答案 0 :(得分: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();
  }

答案 1 :(得分:0)

这可能与所有权有关。当一个小部件被销毁时,它还会照顾它的子节点,在你的情况下,布局和子小部件。 QWidget destructior试图破坏对象,但它们是在堆栈上分配的,而不是动态的。

尝试为QLayouts和小部件使用动态分配。