我的非常简单的例子在我使用继承(class NapanaApplication : public QGuiApplication
)时崩溃了,但是在直接使用QGuiApplication
时没有崩溃并且正常工作。
代码完全如下所示,NapanaApplication
没有做任何事情,只是继承自QGuiApplication
。
怎么了?
已解决:我找到了理由。这是因为QGuiApplication
将argc
作为参考,但NapanaApplication
构造函数不会。它不会产生任何错误,但会导致QGuiApplication
使用某个临时argc
变量而不是来自main
的变量进行操作。
的main.cpp
#include "napanaapplication.h"
#include "napanawindow.h"
int main(int argc, char* argv[]) {
/*NapanaApplication app(argc, argv);*/ // segmentation fault
QGuiApplication app(argc, argv); // no error
NapanaWindow win;
win.resize(800, 600);
win.show();
return app.exec();
}
napanaapplication.h
#ifndef NAPANAAPPLICATION_H
#define NAPANAAPPLICATION_H
#include <QGuiApplication>
class NapanaApplication : public QGuiApplication
{
Q_OBJECT
public:
explicit NapanaApplication(int argc, char* argv[]);
signals:
public slots:
};
#endif // NAPANAAPPLICATION_H
napanapplication.c
#include "napanaapplication.h"
NapanaApplication::NapanaApplication(int argc, char* argv[]) : QGuiApplication(argc, argv) {}
来自调试器的输出:在strlen
中调用QString::fromLocal8Bit
时崩溃。调用char*
的{{1}}指针具有值strlen
,我不明白为什么,它可能来自0x21
。
argv
答案 0 :(得分:8)
Note the signature of QGuiApplication:
QGuiApplication(int & argc, char ** argv)
您的功能改为int argc
。我认为当整数值被父类构造函数视为引用时,你会导致段错误。