Guten Tag alle, ich habe einen Fehler in meinem Code entdeckt, das heißt:Ist deleteLater() von Qt5.7 vom Betriebssystem abhängig?
Ich habe eine Liste von Zeigern auf QLocalSocket und in der destructor Ich schließe und löschen Sie sie mit dem folgenden Code
for (int i = 0; i < localSocketsList.size(); i++)
{
if (localSocketsList.at(i) != NULL)
{
localSocketsList.at(i)->close();
localSocketsList.at(i)->deleteLater();
}
}
der Fehler war, dass ich vorher einen Schlitz mit dem getrennten verbunden() Signal der Buchsen und die Schlitz sich mit dem Code auch löschen:
QMutableListIterator<QLocalSocket *> iterator(localSocketsList);
while(iterator.hasNext())
{
QLocalSocket * currentLocalSocket = iterator.next();
if (currentLocalSocket -> state() == QLocalSocket::UnconnectedState)
{
currentLocalSocket -> deleteLater();
iterator.remove();
}
}
Ok jetzt können Sie den Fehler sehen, die ich versuche, lösche einen Zeiger twic e und ich haben einen Unfall. ABER, es dauerte eine Weile, um diesen Fehler zu erkennen, weil ich keinen Absturz in Windows 10 beobachtet, nur in Windows 7.
Die Frage ist: Gibt es einen Unterschied in der deleteLater() -Funktion von Qt5.7 abhängig des operativen Systems? Sollte dieses Problem nicht auf allen Plattformen auftreten, da es sich um einen C++ Laufzeitfehler handelt?
Vielleicht hängt etwas davon ab, wie Qt den Job plant (ich beende den Zyklus vor dem Senden der Signale). In diesem Fall ist der Zeitplan der Jobs abhängig vom Betriebssystem? Sollte das nicht fast "zufällig" sein?
Vielen Dank allen
Sind Sie sicher, dass es im selben Ereignisschleifenzyklus passiert? Es ist OK, es mehrmals im selben Zyklus aufzurufen, da ausstehende Ereignisse entfernt werden, aber wenn es nicht derselbe Zyklus ist, werden Sie einen Absturz bekommen, weil es ein ungeeigneter Zeiger ist. – dtech
Interessant, ich wusste nicht, dass ich deleteLater zweimal im selben Zyklus aufrufen könnte. Aber warum in Windows 10 habe ich keinen Fehler? – n3mo