簡體   English   中英

Qt:使用qobject_cast進行分段錯誤

[英]Qt: Segmentation fault with qobject_cast

Qt文檔中 ,有一個關於qobject_cast使用的示例。

按照這個例子,我試過這個:

#include <QApplication>
#include <QTimer>
#include <QDebug>

void test_cast(QObject *returnedObject)
{
    QTimer *timer = new QTimer;
    timer->setInterval(500);
    returnedObject = timer;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);    

    QObject *obj;
    test_cast(obj);

    QTimer *timer = qobject_cast<QTimer *>(obj);

    if(timer)
        qDebug() << timer->interval(); //Should be 500

    return a.exec();
}

此代碼編譯但在運行時,程序崩潰在行:

QTimer *timer = qobject_cast<QTimer *>(obj);

調試器說這是由於qobject_cast的分段錯誤。 我不明白問題出在哪里。 所以我有一個問題,為什么有一個seg。 錯?

問題出在這個函數中:

void test_cast(QObject *returnedObject)
{
    QTimer *timer = new QTimer;
    timer->setInterval(500);
    returnedObject = timer; //<-- changes the returnObject
}

實際上,您不會更改傳遞給test_cast函數的obj指針,而是修改它的副本( returnedObject )。 結果, main函數中的obj指針保持未初始化狀態,程序崩潰。 要解決此問題,您需要按以下方式修改函數:

void test_cast(QObject **returnedObject)
{
    QTimer *timer = new QTimer;
    timer->setInterval(500);
    *returnedObject = timer;
}

並將此函數稱為:

QObject *obj;
test_cast(&obj);

這是對vahancho答案的評論。

您還可以通過引用傳遞指針:

void test_cast(QObject *&returnedObject);

但是,如果只是查看函數調用,指針地址可能會改變可能並不明顯,如下所示:

QObject *obj;
test_cast(obj);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM