10

我正在尝试创建一个控制台应用程序,Qt并且在尝试检索参数时遇到了非常奇怪的行为。我的类派生自QCoreApplication它有一个函数,通常应该将所有 args 放在某个strings. 但在某些情况下,调用以分段错误结束。

这是代码:

主文件

#include "Diagramm.h"

int main(int argc, char *argv[])
{
    Diagramm application(argc, argv);
    application.run();
    return EXIT_SUCCESS;
}

图表.h

#include <QCoreApplication>
#include <iostream>
#include <QStringList>
#include <QFile>
#include <QDebug>


class Diagramm : public QCoreApplication
{
    Q_OBJECT

    public:
        Diagramm(int argc, char *argv[]);
        void run();
    private:
        void testArguments();
    signals:
    public slots:
};

图表.cpp

#include "Diagramm.h"

Diagramm::Diagramm(int argc, char *argv[]) : QCoreApplication(argc, argv)
{
    //std::cout << "calling Diagramm constructor" << std::endl;
}

void Diagramm::run()
{
    testArguments();
}

void Diagramm::testArguments()
{
    //get source and target files from arguments
    QStringList arguments = this->arguments();

    if(arguments.count() < 2)
    {
        std::cout << "Missing arguments" << std::endl;
        return exit(1);
    }
}

编译和执行上面的代码时,一切正常,但是当我取消注释Diagramm's 构造函数中的行时,我在函数的第一行出现了分段错误testArguments(对 的调用arguments()

我已经做了好几个小时了,阅读 Qt 的文档,论坛......有谁知道它来自哪里?任何想法将不胜感激。

注意:我不是exec故意调用该函数,因为我不需要任何事件循环。

4

2 回答 2

17

Q(Core)Application想要argcargv 通过引用,所以你的构造函数应该阅读

Diagramm(int& argc, char **argv[])

如果你不这样做,它可能会在某些情况下起作用,并在其他情况下导致段错误或奇怪的行为,就像你遇到的那样。似乎是一个常见错误,在阅读文档时不容易发现。

于 2012-08-27T05:40:01.263 回答
0

arguments()是一个静态函数,所以该行应该是:

QStringList arguments = QCoreApplication::arguments();
于 2012-08-27T05:02:05.950 回答