在Qt中,如果從一個臨時對象調用一個信號,這樣該對象可能會在該槽被調用的時候被刪除,這是錯誤嗎?Qt signals/slots:從臨時對象發出信號是否是錯誤的?
如果相關,代碼將發出來自臨時對象構造函數的信號。 (注意:沒有指針或引用作爲參數傳遞,所以這不是關於懸掛指針或引用的問題,我只是想知道,如果以最簡單的形式發出一個信號是可以接受的從Qt中的一個臨時對象)
這裏是我的代碼縮短版本:
// My application
class HandyApplication: public QApplication
{
Q_OBJECT
public:
explicit HandyApplication(int argc, char * argv[]);
signals:
public slots:
void handySlot(std::string const msg);
};
// Class that will be instantiated to a temporary object
class Handy: public QObject
{
Q_OBJECT
public:
Handy()
{
QObject::connect(this, SIGNAL(handySignal(std::string const)),
QCoreApplication::instance(),
SLOT(handySlot(std::string const)));
emit handySignal("My Message");
}
signals:
void handySignal(std::string const msg);
};
// An unrelated function that may be called in another thread
void myFunction()
{
Handy temporaryObject; // This constructor call will emit the signal "handySignal" above
}
正如你所看到的,臨時對象發出從它的構造函數的信號,然後立即銷燬。 因此,可以在發送信號的對象被銷燬後調用該插槽。
這是安全的,還是這是一個潛在的問題或錯誤條件?
這不是真的,如果信號是從一個不同的線程發出的,而不是調用該槽的線程,* emit *調用可能是異步的? –
@DanNissenbaum:雅這就是我說的話。當它在不同的線程中時,它變成排隊的連接。但即使情況如此,如果信號不是發射可能無效的物體,那也沒有問題。無論發送者如何,該調用都會被註冊到目標線程事件循環中並被調用。 – jdi
你需要*呼叫是同步還是異步,或者你只是不在乎?在前一種情況下,你可能只需調用方法('obj-> method(args)');在後者使用帶有QueuedConnection的'QMetaObject :: invokeMethod'來強制在返回事件循環時發生調用。 – peppe