我在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:调用“运行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&gt; :: operator(),boost :: _ bi :: list0&gt; bind.hpp 253 0x424600
3 boost :: _ bi :: bind_t,boost :: _ bi :: list1&gt; &gt; :: operator()bind_template.hpp 20 0x4245af
4 boost :: detail :: thread_data,boost :: _ bi :: list1&gt; &GT; &gt; :: run thread.hpp 61 0x42431c
5 thread_proxy /usr/lib/libboost_thread.so.1.46.1 0x7ffff7bcfba9
6 start_thread /lib/x86_64-linux-gnu/libpthread.so.0 0x7ffff6557efc
7 clone /lib/x86_64-linux-gnu/libc.so.6 0x7ffff5af159d
8 ??
以上追踪中的第0个点指向 UI-&GT; missionview-&GT; invalidateScene() 这里图形视图从函数 playthread 绑定到boost线程。但我不确定为什么这会在头文件中添加变量时出现问题,因为我没有在cpp文件中的任何位置使用变量。
答案 0 :(得分:1)
进入项目文件夹并删除 *.pro.user 文件。下次打开项目时,您只需重新配置它(即选择合适的构建工具包)。
我知道这是一个旧线程,但我自己也遇到了同样的问题。每次我尝试向头文件中添加变量时,都会导致堆损坏错误。我没有在堆上分配内存,甚至没有为此声明指针变量。这非常令人沮丧,因为我一开始不知道它是什么。我最终将其缩小到将变量添加到导致崩溃的头文件中。根据 doomguy 的经验,我知道它在 build 文件夹中是持久的,因为他说重新安装 Qt 不起作用。我很高兴我读到了它,因为如果我重新安装这个庞然大物但它仍然无法正常工作,我会很生气。根据之前的经验,.user 文件中的损坏可能会导致问题,删除它会让您有一个干净的石板。故事寓意:如果您发现异常行为似乎表明 IDE 中存在问题,请尝试删除 .user 文件,然后再尝试更极端的措施。
答案 1 :(得分:0)
不确定问题是否是由此导致的,但如果标头包含QObject派生类,则应运行qmake ,然后构建应用程序。
LE:如果不是这样,我建议您再向我们展示一些代码(您的代码,而不是Qt代码)