Die Frage ist alt, aber ich werde das für die zukünftige Generation lassen)
Die Antwort, die als Antwort markiert wurde, ist korrekt, aber seltsam formuliert.
Eigentlich enthält deine Frage eine richtige Antwort:
Meldungsschleife endet bereits mit der Rückkehr von a.exec? Und so kam es dass der
Löschungsereignis wird nie verarbeitet, in der Tat nicht einmal in eine
Nachrichtenwarteschlange, da keine vorhanden ist.
Genau das passiert gerade. Alles deleteLater()
tut gerade ein Löschungsereignis in die outer Ereignisschleife. Wenn das Ereignis verarbeitet wird, wird das Objekt gelöscht. Wenn jedoch keine utter-Ereignisschleife vorhanden ist und später keine Ereignisschleife im Ausführungsablauf auftritt, wird das Ereignis nie gesendet. Daher wird das Objekt nie gelöscht.
Wenn Sie deleteLater()
im Destruktor des Objekts aufrufen und ein Objekt auf den Stack setzen - deleteLater()
wird aufgerufen, wenn das Objekt den Gültigkeitsbereich verlässt. In Ihrem Beispiel wird "out of scope" ausgeführt, wenn geschweifte Klammern von main()
function gefunden werden. Zu diesem Zeitpunkt hat a.exec()
(welches die Hauptereignisschleife von Qt App darstellt) bereits - & gt; keine Ereignisschleife mehr zurückgegeben - & gt; deleteLater()
wurde aufgerufen, aber es ist nicht möglich, ein Löschungsereignis zu veröffentlichen. - & gt; Objekte sollten "deletedLater" niemals gelöscht werden ...
Was den Teil betrifft, in dem deleteLater () verwendet werden soll:
Kuba Ober antwortete:
Im Allgemeinen gibt es eine Reihe von Umständen, unter denen
deleteLater sollte verwendet werden. Wahrscheinlich sollten Sie einfach nicht verwenden
es ...
Hören Sie nicht darauf, es ist absolut falsch als die ganze Antwort. Was Sie tun sollten und was sollten Sie nicht besser entscheiden, nachdem Sie diesen Artikel gelesen haben. Es handelt sich zwar um Qt-Threads, aber der Artikel sagt auch etwas über asynchrone Programmierung aus (und, wie Emerald Weapon erwähnt, ist genau das, wofür deleteLater () erstellt wurde).
Außerdem haben intelligente Zeiger und QObject-Elternbesitz nichts damit zu tun, das Löschen mit deleteLater()
zu planen. Diese beiden Techniken verwenden tatsächlich eine einfache Operation delete
unter der Haube. Und wie der Artikel zeigt und wie die Emerald Weapon Antwort gezeigt hat: delete löst nicht die Probleme deleteLater()
. Wenn Sie also ein Objekt löschen müssen, verwenden Sie delete
, wenn Sie es für das Löschen einplanen müssen, verwenden Sie deleteLater()
.
Übrigens, wenn Sie einen intelligenten Zeiger mit deleteLater()
verwenden möchten, können Sie den Deleter angeben:
%Vor%
Und schließlich ist es ein NICHT ein Fehler, deleteLater()
im Destruktor von QObject
für nicht untergeordnete Objekte zu verwenden.