堆上的 QCoreApplication

Posted

技术标签:

【中文标题】堆上的 QCoreApplication【英文标题】:QCoreApplication on the heap 【发布时间】:2017-05-06 20:27:47 【问题描述】:

我需要(例如在构建库时)在堆上实例化 QCoreApplication,我发现了以下奇怪的行为(Qt 5.7):

#include <QCoreApplication>
#include <QDebug>

class Test

public:
    Test(int argc, char *argv[]) 
        m_app = new QCoreApplication(argc, argv);

        //uncomment this line to make it work
        //qDebug() << "test";
    
    ~Test()  delete m_app; 
private:
    QCoreApplication* m_app;
;

int main(int argc, char *argv[])

    Test test(argc, argv);
    qDebug() << QCoreApplication::arguments(); //empty list!

基本上,如果在分配对象后使用“qDebug()”,一切都会按预期工作。如果不是,arguments() 的列表为空。

【问题讨论】:

【参考方案1】:

它似乎与this bug 有关,它在 Qt 5.9 中已修复并向后移植到 Qt 5.6.3。解决方法很简单:

#include <QCoreApplication>
#include <QDebug>

class Test

public:
    Test(int argc, char *argv[]) 
        //allocate argc on the heap, too
        m_argc = new int(argc);
        m_app = new QCoreApplication(*m_argc, argv);
    
    ~Test() 
        delete m_app;
        delete m_argc;
    
private:
    int* m_argc;
    QCoreApplication* m_app;
;

int main(int argc, char *argv[])

    Test test(argc, argv);
    qDebug() << QCoreApplication::arguments();

【讨论】:

【参考方案2】:

我相信修复此错误的另一种方法是通过引用传递argc

#include <QCoreApplication>
#include <QDebug>

class Test

public:
    Test(int& argc, char *argv[]) 
        m_app = new QCoreApplication(argc, argv);

        //uncomment this line to make it work
        //qDebug() << "test";
    
    ~Test()  delete m_app; 
private:
    QCoreApplication* m_app;
;

int main(int argc, char *argv[])

    Test test(argc, argv);
    qDebug() << QCoreApplication::arguments(); //empty list!

此外,您不需要在堆上创建QCoreApplication,将其作为Test 的自动成员就可以了,即QCoreApplication m_app

【讨论】:

我同意,这也应该可以,虽然我还没有测试过。确实,对于这个例子,没有必要在堆上分配QCoreApplication ......但是我也不需要Test 类。在实际代码中,TestQCoreApplication 的实例没有相同的生命周期。但是,如果在堆栈上分配了 QCoreApplication,则该错误不会出现。

以上是关于堆上的 QCoreApplication的主要内容,如果未能解决你的问题,请参考以下文章

为啥堆上的分配比栈上的分配快?

堆上的 C++ 数组声明?

为啥函数执行后没有释放堆上的元素?

JAVA-8 中堆上的字符串对象数

如何查看桌面堆上的内容

堆上的整数向量和释放内存