Seite 1 von 1

Segmentation Fault durch QObject::sender()

Verfasst: 21. Juni 2008 11:01
von mollitz
Hallo,
Zuerst ein mal die Codes:
In einer Serverapplikation wird mit nextPendingConnection ein QSocket geholt, dieses wird verbunden und manipuliert, unter anderem auch mit diesem connect:

Code: Alles auswählen

connect( tmpSocket, SIGNAL ( disconnected() ), this, SLOT( disconnectClient() ) );
wenn jetzt der slot disconnectClient() aus dem signal disconnected aufgerufen wird, muss ich den zeiger auf das QTcpSocket kennen.
entweder so:

Code: Alles auswählen

QObject* sender = const_cast<QObject*> ( QObject::sender() );
QTcpSocket *socket = static_cast<QTcpSocket*> ( sender );
oder so

Code: Alles auswählen

QTcpSocket *socket = (QTcpSocket*)QObject::sender();
welches ich nehme ist egal, denn das resultat ist das gleiche:
irgendwann später, also nicht direkt beim aufruf gibt es ein segmentation fault.
also ich habe den debugger angeworfen und dann immer weiter geklickt und dann macht der die qt-internen sachen und irgendwann gibts ein segmentation fault. per kommentieren und neukompilieren hab ich rausgefunden, dass es dann wohl an dem QObject::sender() liegen muss.
weiß von euch einer Rat was falsch sein könnte?

Verfasst: 21. Juni 2008 12:47
von Christian81
Warum dieses komische const-cast?
Wie gehst Du sicher, dass beim Ausführen des Slots das TCPSocket-Objekt noch vorhanden ist?

Verfasst: 21. Juni 2008 13:21
von myme
Also, ich würde den static_cast durch einen dynamic_cast ersetzen. Überlege nur kurz, wann "disconnected" ausgeführt werden kann. Richtig, auch zum Beispiel im Destruktor von Basisklassen und der Sender ist dann nicht mehr vom Typ QTcpSocket. Der dynamic_cast<QTcpSocket*>(sender) wird in diesem Fall Null zurückliefern.

Verfasst: 21. Juni 2008 16:40
von solarix
irgendwann später
"später" in diesem Slot, oder noch später (nach dem Slot)?
nicht direkt beim aufruf
Was für ein Aufruf? Was machst du den "später" mit diesem Pointer (welche Methoden rufst du noch auf?

sender() kann gewöhnlich mit einem QSignalMapper umgangen werden... Ginge das auch in deinem Fall?

Verfasst: 24. Juni 2008 14:19
von mollitz
also das mit den casts hab ich bisher nur am rande verstanden!
diese variante:

Code: Alles auswählen

QObject* sender = const_cast<QObject*> ( QObject::sender() );
QTcpSocket *socket = static_cast<QTcpSocket*> ( sender ); 
hab ich aus einem Qt-Beispiel kopierrt, aber ich nehm mal lieber nur meine eigene ( QTcpSocket *socket = (QTcpSocket*)QObject::sender(); )

@myme: ich hab nirgends ein delete auf das socket, warum sollte es dann nichr mehr existieren ?

@solarix: viel später! ich drück im debugger (in kdevelop) immer auf nächste anweisung und dann macht der da ganz viele komische qt-interne sachen und irgendwann kommt dann das signal SIGSEV, oder wie das hieß.
mit dem aufruf mein ich den QObject::sender() aufruf!
mit dem pointer auf das socket mach ich ziemlich viel, da fließen halt daten hin und her und wenn der socket das signal gibt, dass die verbindung unterbruchen wird, soll das ganze drummrum aufgeräumt werden.