Partage
  • Partager sur Facebook
  • Partager sur Twitter

sigsegv dans la suppression d'un Object

Sujet résolu
    21 novembre 2021 à 19:38:15

    bonjour,

    j'ai une liste d'utilisateurs d'un QTcpSocet mais lors de la supression d'un de ces utilisateur l'application crash

    voici comment je suprime les utilisateur :

    void Widget::server_disconnectclients()
    {
        QTcpSocket* disconnectingClientSocket = qobject_cast<QTcpSocket*>(sender());
    
        if(disconnectingClientSocket == nullptr) //Error
        {
            server_displayMessagelist(server_generatemesage(tr("Erreur fatal: les clients ne peuvent pas être supprimés. fermeture!"),tr("Serveur Bot")));
            QMessageBox::critical(this, tr("Erreur fatal"),tr("Les clients ne peuvent pas être supprimés. fermeture!"));
            qApp->quit();
            return;
        }
    
        int index = server_findIndex(disconnectingClientSocket);
        utilisateur* disconnectingClient = clientsList[index];
        serveur_sentcommande("disconnected",disconnectingClient->getpseudo());
    
        clientsList.removeOne(disconnectingClient);
        delete disconnectingClient;
    }

    et voila comment je les crée

    void Widget::server_newconect()
    {
        utilisateur* newClient = new utilisateur(m_serveur->nextPendingConnection());
        clientsList.append(newClient);
        connect(clientsList.last()->getSocket(), SIGNAL(readyRead()), this, SLOT(server_datareceived()));
        connect(clientsList.last()->getSocket(), SIGNAL(disconnected()), this, SLOT(server_disconnectclients()));
        for(int i = 0; i < saveMessage.size()-1; i++)
        {
            server_sentmessageto(saveMessage[i],clientsList.size()-1);
        }
    }

    client liste est une liste de type 

    QList<utilisateur*> clientList;

    savez vous ou est le bug ? voulez vous plus d'info ?

    merci d'avance 

    -
    Edité par unel 21 novembre 2021 à 19:38:37

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2021 à 1:28:59

      Bonjour,

      On n'efface pas directement l'objet à l'origine du déclenchement du slot (ici le QTcpSocket qui a émis le signal "disconnected()") dans le slot lui-même, parce que le système de signal/slot peut encore avoir besoin de faire des opérations sur cet objet après la fin du slot (ex: appeler les autres slots connectés au même signal).

      Il faut juste remplacer:

      delete disconnectingClient;

      par 

      disconnectingClient->deleteLater();

      qui va effacer l'objet après le traitement complet du signal disconnected().


      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2021 à 18:10:49

        merci ca marche Nikel !

        merci !

        sujet résolut.

        • Partager sur Facebook
        • Partager sur Twitter

        sigsegv dans la suppression d'un Object

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown