C ++ - 继承时的分段错误

时间:2015-10-22 00:17:21

标签: c++ qt

我的非常简单的例子在我使用继承(class NapanaApplication : public QGuiApplication)时崩溃了,但是在直接使用QGuiApplication时没有崩溃并且正常工作。

代码完全如下所示,NapanaApplication没有做任何事情,只是继承自QGuiApplication

怎么了?

已解决:我找到了理由。这是因为QGuiApplicationargc作为参考,但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

1 个答案:

答案 0 :(得分:8)

Note the signature of QGuiApplication

QGuiApplication(int & argc, char ** argv)

您的功能改为int argc。我认为当整数值被父类构造函数视为引用时,你会导致段错误。