2016-08-12 59 views
4

看一下下面的代碼:爲什麼允許創建多個QCoreApplication對象?

#include <QDebug> 
#include <QCoreApplication> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication app(argc, argv); 
    qDebug() << QCoreApplication::instance(); // prints QCoreApplication(0x7ffd39656150) 
    QCoreApplication app2(argc, argv); 
    qDebug() << QCoreApplication::instance(); // prints QCoreApplication(0x7ffd39656160) 

    return 0; 
} 

看起來,它可以創建一個以上的QCoreApplication對象,但應該是一個單身。第一個創建的QCoreApplication對象會發生什麼?當兩個對象調用exec時,它會被銷燬還是會出現兩個事件循環?

+0

您正在構建兩次單身人士。你期望什麼?你不應該那樣做。單例並不意味着一個類作爲底層實例的句柄。 'Q_GLOBAL_STATIC'實現它。 –

+0

再次運行你的測試。在運行兩個qDebug語句之前創建'QCoreApplication'的兩個實例,您將看到內存地址相同。這意味着當您創建第二個實例時,單例實例將被替換(但不會被刪除)。 – RobbieE

回答

6

這是違法的。您可能會針對Qt的發佈版本運行,並禁用斷言。

https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qcoreapplication.cpp.html#742使得它很清楚,你不能有兩個QCoreApplication同時還活着:

void QCoreApplicationPrivate::init() 
{ 
    Q_Q(QCoreApplication); 

    initLocale(); 

    Q_ASSERT_X(!QCoreApplication::self, "QCoreApplication", "there should be only one application object"); 
    QCoreApplication::self = q; 

    .... 
0

這是不允許的。編譯器的工作並不總是告訴你你的錯誤。你錯誤地認爲只是因爲一些代碼編譯,如果代碼是錯誤的,它在編譯器上以某種方式。

相關問題