[英]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.