【问题标题】:Declaring variables in header file of QT causes program to unexpectedly finish在 QT 的头文件中声明变量导致程序意外完成
【发布时间】:2013-01-17 19:30:48
【问题描述】:

我在 QtCreator 上有一个基于 QWidget 的项目“Cybaware_ver1”,一切正常。我有一个包含公共和私有变量和函数的类的头文件。但是,自从有一天我尝试在头文件中声明一个新变量,甚至是一个“int”变量并运行项目时,我得到了

The program has unexpectedly finished.
/home/devdeep/Cybaware_ver1-build-Desktop_Qt_5_0_0_GCC_64bit_SDK-Debug/Cybaware_ver1       exited with code 0

以前我可以毫无问题地在头文件中添加变量。目前,我可以添加新功能、修改 UI 等。只是我无法将变量添加到头文件中。我找到了在 cpp 文件中将这些变量声明为静态的临时解决方案。但是,我想找到解决此问题的方法。 我已尝试重新安装 Qt,但问题仍然存在。我在 Ubuntu Linux 上运行它。 请让我知道是否有解决此问题的方法。另外,我不确定我可以提供哪些其他信息。所以请告诉我。

更新:好的。我使用了调试器,它说错误是分段错误。 它指向 qdebug.h 的以下部分以及由 qt_message_output 标记的行。

public:
inline QDebug(QIODevice *device) : stream(new Stream(device)) {}
inline QDebug(QString *string) : stream(new Stream(string)) {}
inline QDebug(QtMsgType t) : stream(new Stream(t)) {}
inline QDebug(const QDebug &o):stream(o.stream) { ++stream->ref; }
inline QDebug &operator=(const QDebug &other);
inline ~QDebug() {
    if (!--stream->ref) {
        if(stream->message_output) {
            QT_TRY {
                qt_message_output(stream->type,
                                  stream->context,
                                  stream->buffer);
            } QT_CATCH(std::bad_alloc&) { /* We're out of memory - give up. */ }
        }
        delete stream;
    }
}

我猜这是内存不足错误。可能,关闭其他程序可能会有所帮助?

UPDATE2:调用“run qmake”没有帮助。这是我的头文件:

#ifndef MAINVIEW_H
#define MAINVIEW_H

#include <QWidget>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsLineItem>
#include <QGraphicsEllipseItem>
#include <QGraphicsSimpleTextItem>
#include <list>
#include <QMouseEvent>
#include <QEvent>
#include <QString>
#include <boost/thread.hpp>
#include <qcustomplot.h>
#include <QTimer>
namespace Ui {
class MainView; 
}

class MainView : public QWidget
{
Q_OBJECT

public:
int num_missions;
int num_services;
int timer;


int* num_servpermission;
int missionstartx;
//boost::thread pt;
QGraphicsScene mynewscene;
QGraphicsRectItem* myrect;
QGraphicsRectItem** missionline;
QGraphicsLineItem** missionplayline;
QGraphicsRectItem** playrect;
std::list<QGraphicsLineItem**> missionticks;
std::list<QGraphicsEllipseItem**> missionservices;
std::list<QGraphicsSimpleTextItem**> missionservicesno;
std::list<QGraphicsLineItem**>::iterator ti;
std::list<QGraphicsSimpleTextItem**>::iterator ssi;
//std::list<QGraphicsEllipseItem**>::iterator si;

int* missionlength;
int** missionplayxy;
int* missiontickscount;
int* missioniteration;
int missionselected;
int missiontickselected;
int missiontickoffset;
bool isrepeated;

int temp;


QCustomPlot** customPlot;
QTimer dataTimer;

explicit MainView(QWidget *parent = 0);
void playthread();

bool eventFilter(QObject*, QEvent*);
void testfunc();
void clearview();
void test1();

~MainView();

private slots:
void on_startButton_clicked();
void realtimeDataPlot();

void on_pushButton_clicked();

private:
Ui::MainView *ui;



};


#endif // MAINVIEW_H

程序在添加任何变量时崩溃。比如我刚才添加了变量int temp,它会崩溃。添加任何新内容都会使其崩溃,例如取消注释声明 std::list::iterator si;。我把它拿出来,一切正常。

UPDATE3: 我的外部头文件 qcustomplot.h 位于同一目录中。我也在使用 boost,但我使用 apt-get 进行设置。这是堆栈跟踪:

0 MainView::playthread mainview.cpp 530 0x418fa1
1 boost::_mfi::mf0::operator() mem_fn_template.hpp 49 0x424690
2 boost::_bi::list1 >::operator(), boost::_bi::list0> bind.hpp 253 0x424600
3 boost::_bi::bind_t, boost::_bi::list1 >::operator() bind_template.hpp 20 0x4245af
4 boost::detail::thread_data, boost::_bi::list1 > > >::run thread.hpp 61 0x42431c
5 线程代理 /usr/lib/libboost_thread.so.1.46.1 0x7ffff7bcfba9
6 start_thread /lib/x86_64-linux-gnu/libpthread.so.0 0x7ffff6557efc
7 克隆 /lib/x86_64-linux-gnu/libc.so.6 0x7ffff5af159d
8 ??

上述跟踪中的第 0 个点指向 ui->missionview->invalidateScene() 在这里,图形视图从绑定到 boost 线程的函数 playthread 更新。但我不确定为什么在头文件中添加变量会出现问题,因为我没有在 cpp 文件中的任何地方使用该变量。

【问题讨论】:

  • 调试器说什么?将变量添加到标头后是否进行重建?
  • 这里的一些代码会很有趣:)
  • 发布段错误的堆栈跟踪。
  • 标题是否在另一个目录中?然后你可能会遇到这个:stackoverflow.com/questions/5470438/…

标签: qt


【解决方案1】:

进入项目文件夹并删除 *.pro.user 文件。下次打开项目时,您只需重新配置它(即选择合适的构建工具包)。

我知道这是一个旧线程,但我自己也遇到了同样的问题。每次我尝试向头文件添加变量时,都会导致堆损坏错误。我没有在堆上分配内存,甚至没有为此声明指针变量。这非常令人沮丧,因为我一开始不知道它是什么。我最终将其缩小到将变量添加到导致崩溃的头文件中。根据 doomguy 的经验,我知道它在构建文件夹中是持久的,因为他说重新安装 Qt 不起作用。我很高兴我读到了这篇文章,因为如果我重新安装这个庞然大物但它仍然无法正常工作,我会很生气。根据之前的经验,.user 文件中的损坏可能会导致问题,删除它可以让您从头再来。故事的寓意:如果您遇到似乎表明 IDE 存在问题的异常行为,请尝试删除 .user 文件,然后再尝试更极端的措施。

【讨论】:

    【解决方案2】:

    不确定问题是否由此引起,但如果标头包含 QObject 派生类,您应该运行 qmake,然后构建您的应用程序。

    LE:如果不是这种情况,我建议您向我们展示更多代码(您的代码,而不是 Qt 代码)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多