Es gibt ein Objekt der Klasse QNetworkReply. Es gibt einen Steckplatz (in einem anderen Objekt), der mit seinem fertigen () Signal verbunden ist. Die Signale sind synchron (die Standardsignale). Es gibt nur einen Thread.
Irgendwann möchte ich beide Objekte loswerden. Keine Signale mehr oder irgendetwas von ihnen. Ich will, dass sie weg sind. Nun, ich dachte, ich werde verwenden
delete obj1; delete obj2;
Aber kann ich das wirklich? Die Spezifikationen für ~ QObject sagen:
Das Löschen eines QObjects, während ausstehende Ereignisse auf die Zustellung warten, kann zu einem Absturz führen.
Was sind die "ausstehenden Ereignisse"? Könnte das bedeuten, dass während ich meine anrufe delete
, bereits einige "ausstehende Ereignisse" zugestellt werden müssen und dass sie einen Absturz verursachen können und ich nicht wirklich überprüfen kann, ob es welche gibt?
Nehmen wir also an, ich rufe an:
obj1->deleteLater(); obj2->deleteLater();
Sicher sein.
Aber bin ich wirklich sicher? Das deleteLater
fügt ein Ereignis hinzu, das in der Hauptschleife behandelt wird, wenn die Steuerung dort ankommt. Kann es einige ausstehende Ereignisse (Signale) für obj1
oder obj2
bereits geben, die darauf warten, in der Hauptschleife behandelt zu werden, bevor deleteLater behandelt wird? Das wäre sehr unglücklich. Ich möchte keinen Code schreiben, der den Status "etwas gelöscht" überprüft und das eingehende Signal in allen meinen Steckplätzen ignoriert.
obj->disconnect(); obj->deleteLater();
als wäre der richtige Weg: