IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

delete un pointeur dans QList

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut delete un pointeur dans QList
    Bonjour à tous,

    Je me permet de venir vers vous car j'ai un problème lors de l'appel de la fonction delete sur un objet stocké dans une QList.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void TcpServer::OnSocketStateChanged(TcpSocket *socket, int state)
    {
        switch (state)
        {
        case TcpSocket::UnconnectedState:
            qDebug() << "Deconnexion du socket" << socket->socketDescriptor();
            socketList.removeOne(socket);
            delete socket; // aie !!!
            break;
        }
    }
    Voici le header de tcpsocket si besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #ifndef TCPSOCKET_H
    #define TCPSOCKET_H
     
    #include <QtNetwork/QTcpSocket>
     
    class TcpSocket
        : public QTcpSocket
    {
        Q_OBJECT
    public:
        TcpSocket() = delete;
        TcpSocket(const TcpSocket &) = delete; // desactive le constructeur de copie
        TcpSocket& operator=(const TcpSocket &) = delete; // desactive l'opérateur d'affectation
     
        TcpSocket(qintptr handle, QObject* parent = nullptr);
        ~TcpSocket();
     
    signals:
        void SigReadyRead(TcpSocket* socket);
        void SigStateChanged(TcpSocket* socket, int state);
    };
     
    #endif // TCPSOCKET_H
    La liste d'objet de type pointeur TcpSocket
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QList<TcpSocket*> socketList;
    Lors du delete, l'application plante, je tiens à préciser que TcpSocket est une classe qui hérite de QTcpSocket et TcpServer hérite de QTcpServer.
    D'après ce que j'ai pu comprendre dans la doc QList::removeOne ne fait pas appel au deleteur de l'objet, si j'affiche l'adresse du pointeur 'socket' il semble toujours actif.
    Si l'un d'entre vous a une idée je suis preneur !

    Bonne fin de journée à tous.

    Anthony

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 752
    Par défaut


    Citation Envoyé par Ganondorf Voir le message
    si j'affiche l'adresse du pointeur 'socket' il semble toujours actif.
    delete ne met pas l'adresse à zéro, il appelle le destructeur de l'objet et s'arrête là. Peux-tu toujours appeler des méthodes de l'objet sans plantage ? (Même si on nage là en plein dans les comportements non définis…)

    Pourquoi as-tu besoin de pointeurs dans ta liste ? Ne peux-tu pas avoir un QList<TcpSocket> socketList, en récupérant des références avec [] ? (Dans l'idée qu'un code sans pointeur est un code avec moins de chances de planter…)

    Vu ton erreur, je regarderais de plus près le destructeur de TcpSocket. Quand tu utilises un débogueur, où ton code plante-t-il ?

    Pourquoi utiliser removeOne ? Vu ton architecture, je vois le besoin, mais ça serait plus propre et largement plus efficace d'utiliser un index avec erase.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    Salut,

    Alors après pas mal de test pour voir d’où venait l'erreur je n'ai toujours pas trouvé !
    J'ai donc changé mon fusil d'épaule et je passe maintenant par une liste de 'shared_ptr', je n'ai plus qu'a supprimer un élément dans la liste pour automatiquement appeler le deleteur.
    En ce qui concerne l'utilisation des pointeurs c'est une sale manie que j'ai, j'ai commencé le C et maintenant le C++ un peu comme un gland sans forcement comprendre exactement tout ce que je fais !
    Merci pour ton aide.

    Anthony

Discussions similaires

  1. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42
  2. Libération de pointeurs dans un std::vector
    Par G dans le forum SL & STL
    Réponses: 17
    Dernier message: 06/04/2005, 22h37
  3. Réponses: 2
    Dernier message: 15/11/2004, 15h12
  4. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo