3 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果遵循以下兩個(gè)基本規(guī)則,則刪除QObject通常是安全的(即,在正常實(shí)踐中;可能是我不了解atm的病理情況):
切勿刪除插槽(或方法)中的對(duì)象,該插槽或方法被(同步,連接類型“直接”)信號(hào)直接或間接從要?jiǎng)h除的對(duì)象中調(diào)用。例如,如果您有一個(gè)帶有信號(hào)Operation :: finished()和插槽Manager :: operationFinished()的類Operation,則不想刪除在該插槽中發(fā)出信號(hào)的操作對(duì)象。發(fā)出finished()信號(hào)的方法可能會(huì)在發(fā)出之后繼續(xù)訪問(wèn)“ this”(例如訪問(wèn)成員),然后對(duì)無(wú)效的“ this”指針進(jìn)行操作。
同樣,切勿刪除從對(duì)象的事件處理程序中同步調(diào)用的代碼中的對(duì)象。例如,請(qǐng)勿在其SomeWidget :: fooEvent()或從此處調(diào)用的方法/插槽中刪除SomeWidget。事件系統(tǒng)將繼續(xù)對(duì)已刪除的對(duì)象->崩潰進(jìn)行操作。
由于回溯通??雌饋?lái)很奇怪(就像訪問(wèn)POD成員變量時(shí)崩潰一樣),尤其是當(dāng)您具有復(fù)雜的信號(hào)/插槽鏈(其中刪除可能會(huì)發(fā)生幾步下降,最初是由信號(hào)或事件發(fā)起的)時(shí),兩者都很難追蹤。被刪除的對(duì)象。
這種情況是deleteLater()的最常見(jiàn)用例。它確保當(dāng)前事件可以在控件返回到事件循環(huán)之前完成,事件循環(huán)然后刪除該對(duì)象。我發(fā)現(xiàn),另一個(gè)更好的方法通常是使用排隊(duì)的連接/ QMetaObject :: invokeMethod(...,Qt :: QueuedConnection)延遲整個(gè)操作。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
您推薦的文檔的后兩行給出了答案。
從?QObject,
在等待事件發(fā)送時(shí)刪除QObject可能導(dǎo)致崩潰。如果QObject與當(dāng)前正在執(zhí)行的線程不在同一線程中,則不能直接刪除它。使用deleteLater()代替,這將導(dǎo)致事件循環(huán)在所有未決事件傳遞到對(duì)象后刪除該對(duì)象。
它明確表示我們不要從其他線程中刪除。由于您只有一個(gè)線程應(yīng)用程序,因此刪除是安全的QObject。
否則,如果您必須在多線程環(huán)境deleteLater()中將其刪除,請(qǐng)使用它將QObject在處理完所有事件后將其刪除。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
您可以閱讀有關(guān)以下內(nèi)容之一的Delta對(duì)象規(guī)則來(lái)找到問(wèn)題的答案:
信號(hào)安全(SS)。
從一個(gè)對(duì)象的信號(hào)之一調(diào)用的插槽中調(diào)用對(duì)象(包括析構(gòu)函數(shù))上的方法必須是安全的。
分段:
QObject的核心是支持在發(fā)信號(hào)時(shí)刪除。為了利用它,您只需確保您的對(duì)象在刪除后不嘗試訪問(wèn)其自己的成員。但是,大多數(shù)Qt對(duì)象不是以這種方式編寫(xiě)的,也不要求它們兩者都存在。因此,如果需要在對(duì)象的信號(hào)之一期間刪除對(duì)象,建議始終調(diào)用deleteLater(),因?yàn)椤皠h除”可能會(huì)使應(yīng)用程序崩潰。
不幸的是,何時(shí)使用“ delete”和deleteLater()并不總是很清楚。也就是說(shuō),代碼路徑具有信號(hào)源并不總是很明顯。通常,您可能會(huì)有一段代碼在今天安全的某些對(duì)象上使用“刪除”,但是在將來(lái)的某個(gè)時(shí)候,同一代碼塊最終會(huì)從信號(hào)源中被調(diào)用,現(xiàn)在您的應(yīng)用程序突然崩潰了。解決此問(wèn)題的唯一通用方法是始終使用deleteLater(),即使乍一看似乎沒(méi)有必要。
通常,我認(rèn)為Delta對(duì)象規(guī)則是每個(gè)Qt開(kāi)發(fā)人員必須閱讀的內(nèi)容。這是極好的閱讀材料。
- 3 回答
- 0 關(guān)注
- 1947 瀏覽
添加回答
舉報(bào)